xlsxwriter/python-通过索引系列值使用python创建图表

xlsxwriter/python-通过索引系列值使用python创建图表,python,excel,for-loop,series,xlsxwriter,Python,Excel,For Loop,Series,Xlsxwriter,我编写了一个python脚本,它生成几个数据帧,然后将它们相加成一个最终的数据帧。最后一个数据帧,df随后被写入Excel工作簿中的Excel工作表(以及包含以前编写的数据帧的许多其他工作表)。最后一个数据框是一个值,每个月为几个名称指定一个值,如下所示: df = Apr 18 May 18 Jun 18 Character S

我编写了一个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的工作方式也很陌生。我认为我的问题是,我很难正确地将我的系列的values参数赋值给图表

我用来对绘图/测试进行排序的基本代码,作为可能的
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)
如何将我的系列索引到以前创建的excel工作表的单元格中,并使用for循环创建一个5行的线图,每条线有3个点

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


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

放入以前创建的excel工作表的单元格中

xlsxwriter文档声明:“xlsxwriter是一个Python模块,用于以Excel 2007+XLSX文件格式写入文件……它无法读取或修改现有的Excel XLSX文件。”()。因此,无法使用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()
预期产出:

回答得好。您可以添加的一个改进是使用的列表语法,而不是
$A1:$A5
样式的语法。其目的是:以编程方式设置范围。谢谢你们的回答!我能够使用patrickjlong1对字符串编码的建议来循环用户用我的程序创建的任何excel输出。另外,用户用我的程序创建的输出可能有3列以上的数据,所以我使用了@jmcnamara的建议——我必须创建一个数组,然后将其转换为一个带有元组的列表,这样我就可以告诉序列转到最后一列)。谢谢!