2016-11-16 217 views
2

我有一个包含6个选项卡(工作表)的excel文件。每个工作表都具有相同的结构并包含两列 - 第1列包含品牌名称,第2列包含与每个品牌对应的值。对于excel文件中的每张表格,我想制作一个饼图,显示每个品牌的%份额。xlsxwriter - Excel饼图图例 - python

你可以用它来运行该脚本上是here

我写的代码非常简单,并生成图表的例子xls文件。问题在于图表的图例需要序列号名称而不是品牌的名称。

import pandas as pd 
import xlsxwriter as excel 

     df = pd.read_excel("/Users/jack/Documents/python-pptx/filename", sheetname=None) 


     workbook = excel.Workbook('/Users/jack/Documents/python-pptx/chart_pie.xlsx') 

     for sheetname, data in df.iteritems(): 
      if len(data) > 0: 
       worksheet = workbook.add_worksheet(sheetname) 
       chart = workbook.add_chart({'type': 'pie'}) 
       worksheet.write_column('A1', data['Brand']) 
       worksheet.write_column('B1', data['Share_of_interactions']) 
       chart.add_series({'categories': '='+sheetname+'!$A$1:$A$'+str(len(data)), 
            'values':  '='+sheetname+'!$B$1:$B$'+str(len(data)), 
            'name':  '='+sheetname+'!$A$1:$A$'+str(len(data))}) 

       ## insert chart into the worksheet 
       worksheet.insert_chart('C3', chart) 

       ## Close the workbook 
     workbook.close() 

以下是图表的屏幕截图:

enter image description here

如果在图表的传说1,2,3注意到..。 。 7。它实际上应该是说品牌名称。如xlsxwriter - http://xlsxwriter.readthedocs.io/chart.html文档中所述,我已将名称参数添加到chart.add_series。任何帮助将非常感激。

+0

介意分享您的数据帧的样本'df'? –

+0

@JulienMarrec让我把它放在一起,并分享它。 – vagabond

+0

我已经分享了一个excel文件的链接。您可以使用它来运行该脚本。 – vagabond

回答

5

的问题是,你有一个空间,在您的工作表的名称,如Sheet 1。你需要把它们放在单引号:

df = pd.read_excel("/Users/julien/Downloads/SO_Example_Df.xlsx", sheetname=None) 


workbook = excel.Workbook('/Users/julien/Downloads/SO_chart_pie.xlsx') 

for sheetname, data in df.items(): 
    if len(data) > 0: 
     worksheet = workbook.add_worksheet(sheetname) 
     chart = workbook.add_chart({'type': 'pie'}) 
     worksheet.write_column('A1', data['Brand']) 
     worksheet.write_column('B1', data['Share_of_interactions']) 
     # Here, add single quotes around the sheetname 
     chart.add_series({'categories': "='"+sheetname+"'!$A$1:$A$"+str(len(data)), 
          'values':  "='"+sheetname+"'!$B$1:$B$"+str(len(data)), 
          'name':  'My pie chart'}) 

     ## insert chart into the worksheet 
     worksheet.insert_chart('C3', chart) 

## Close the workbook 
workbook.close() 

enter image description here

+0

太棒了!这有效 - 你能解释一下什么'“='”+ sheetname +“'!$ A $ 1:$ A $”'评估为? – vagabond

+0

将'print(“='”+ sheetname +“'!$ A $ 1:$ A $”+ str(len(data)))'添加到循环中,您会看到它的计算结果为'='表1'!$ A $ 1:$ A $ 7'。与Excel中显示的方式相同,如果选择该数据,它会在表名称周围添加单引号(如果有空格) –

+0

再次感谢 - 非常棒 - 我根本没有想到这一点,如果有的话!我的山羊是什么如果没有评估到精确表名称,那么为什么该程序仍在创建图表? – vagabond

1

在Excel和XlsxWriter中,饼图中数据点的名称来自“类别”。这与名称来自系列名称的其他“2D”图表类型不同。这是因为饼图是单个系列图表的特例。

无论如何,如果您将您的类别指向您想要的名称,它们将显示。像这样:

import pandas as pd 

# Some sample data to plot. 
data = {'apples': 10, 'berries': 32, 'squash': 21, 'melons': 13, 'corn': 18} 

# Create a Pandas dataframe from the data. 
df = pd.DataFrame([data], index=['Farm']) 

# Create a Pandas Excel writer using XlsxWriter as the engine. 
excel_file = 'pie.xlsx' 
sheet_name = 'Sheet1' 

writer = pd.ExcelWriter(excel_file, engine='xlsxwriter') 
df.to_excel(writer, sheet_name=sheet_name) 

# Access the XlsxWriter workbook and worksheet objects from the dataframe. 
workbook = writer.book 
worksheet = writer.sheets[sheet_name] 

# Create a chart object. 
chart = workbook.add_chart({'type': 'pie'}) 

# Configure the chart from the dataframe data. 
chart.add_series({ 
    'categories': ['Sheet1', 0, 1, 0, 5], 
    'values':  ['Sheet1', 1, 1, 1, 5], 
}) 

# Insert the chart into the worksheet. 
worksheet.insert_chart('A4', chart) 

# Close the Pandas Excel writer and output the Excel file. 
writer.save() 

此外,请注意使用类别和值的列表而不是范围字符串。这种可选的格式在处理可变数据和处理任何工作表名称引用时更容易。

输出:

enter image description here

+0

但我确实将类别指向了名称:'chart.add_series({'categories':'='+ sheetname +'!$ A $ 1:$ A $'+ str(len(data)), 'values': '='+ sheetname +'!$ B $ 1:$ B $'str(len(data)), 'name':'='+ sheetname +'!$ A $ 1:$ A $'str(len ))})'。即使我删除了'name'参数,我也会得到相同的结果! – vagabond

+0

然后它应该工作,正如我在我的示例中所示。尝试忽略“名称”范围,这应该只是一个单一的点。 – jmcnamara