【问题标题】:xlsxwriter/python - Creating a chart with Python by indexing Series valuesxlsxwriter/python - 通过索引 Series 值使用 Python 创建图表
【发布时间】:2019-01-02 15:44:31
【问题描述】:

我编写了一个 python 脚本,它生成多个数据帧,然后将它们汇总到一个最终数据帧中。然后将最终数据框df 写入 Excel 工作簿中的 Excel 工作表(以及包含之前编写的数据框的许多其他工作表)。最终的数据框是每个月赋予多个名称的值,如下所示:

df = 
                 Apr 18  May 18  Jun 18
    Character                                                        
    Sonic          75.0    23.0    23.0
    Shadow        100.0    38.0    38.0
    Amy           100.0    40.0    40.0
    Tails         100.0    40.0    40.0
    Knuckles       91.0    36.0    37.0


# where {$A1: 'Character', $B$1: 'Apr 18', ...} and so on...

我对 xlsxwriter 的工作方式也很陌生。我认为我的问题是我无法正确地将我假设的系列值参数分配给图表。

我用来某种绘制 April/test 作为可能的for 循环的基础的基本代码在这里:

workbook = writer.book
worksheet = writer.sheets['FINAL VALUES']

chart = workbook.add_chart({'type': 'line'})
chart.add_series({
    'name':       '=FINAL VALUES!$B$1',
    'categories': '=FINAL VALUES!$A$2:$A$5',
    'values':     '=FINAL VALUES!$B$2:$B$5',})

chart.set_title ({'name': 'Line Plot Test'})
chart.set_x_axis({'name': 'Month'})
chart.set_y_axis({'name': 'Value'})

worksheet.insert_chart('D2', chart)

如何将我的系列索引到先前创建的带有 for 循环的 Excel 工作表的单元格中,以创建包含 5 行且每行 3 个点的线图?

我想要这样的东西,在这个例子中我只展示了 Sonic 和 Shadow(请原谅我可怕的绘画技巧)。

【问题讨论】:

    标签: python excel for-loop series xlsxwriter


    【解决方案1】:

    您在帖子中提到了以下内容:

    到之前创建的 Excel 工作表的单元格中

    xlsxwriter 文档指出:“XlsxWriter 是一个 Python 模块,用于以 Excel 2007+ XLSX 文件格式写入文件。......它无法读取或修改现有的 Excel XLSX 文件。” (Link Here)。因此,您无法使用 xlsxwriter 修改现有的 .xlsx 文件。

    如果您可以创建原始 .xlsx 文件,那么使用 xlsxwriter 创建所需的图表类型相对简单。我在下面提供了一个完全可重现的示例。

    import pandas as pd
    
    df = pd.DataFrame({'Character': ['Sonic','Shadow','Amy','Tails','Knuckles'],
                      'Apr 18': [75,90,80,75,60],
                      'May 18': [23,30,60,50,37],
                      'Jun 18': [23,20,26,40,35]})
    
    df = df[['Character','Apr 18','May 18','Jun 18']]
    
    writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
    
    df.to_excel(writer, sheet_name='FINAL VALUES', index=False)
    
    workbook = writer.book
    worksheet = writer.sheets['FINAL VALUES']
    
    chart = workbook.add_chart({'type': 'line'})
    
    for i in range(2, len(df) + 2):
        chart.add_series({
        'categories': "='FINAL VALUES'!$B$1:$D$1",
        'name': "='FINAL VALUES'!$A$%d" % (i),
        'values': "='FINAL VALUES'!$B$%d:$D$%d" % (i, i),
        'line': {
        'width': 1.75,
        },
        'marker': {'type': 'circle'},
        'data_labels': {'value': True},
        })
    
    chart.set_title ({'name': 'Line Plot Test'})
    chart.set_x_axis({'name': 'Month'})
    chart.set_y_axis({'name': 'Value'})
    
    worksheet.insert_chart('D7', chart)
    
    writer.save()
    

    预期输出:

    【讨论】:

    • 好答案。您可以添加的一项改进是使用add_series() 的列表语法,而不是$A1:$A5 样式语法。它旨在用于此目的:以编程方式设置范围。
    • 感谢两位的回答!我能够使用 patrickjlong​​1 对字符串编码的建议来循环用户使用我的程序创建的任何 excel 输出。此外,用户使用我的程序创建的输出可能有超过 3 列数据,所以我使用了 @jmcnamara 的建议——我必须创建一个 OrderedDict 然后将其转换为带有元组的列表,所以我可以告诉系列转到最后一列)。非常感谢!
    猜你喜欢
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多