xlsxwriter - Excel 饼图的图例 - python
xlsxwriter - legend for Excel pie Chart - python
我有一个包含 6 个选项卡的 excel 文件(worksheets)。每个 worksheet 具有相同的结构并包含两列 - Col 1 包含品牌名称,Col 2 包含与每个品牌对应的值。对于 excel 文件中的每个 sheet,我想制作一个饼图来显示每个品牌的份额百分比。
可用于 运行 脚本的示例 xls 文件是 here
我写的代码很简单,可以生成图表。问题是图表的图例采用序列号名称而不是品牌名称。
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:$A$'+str(len(data)),
'values': '='+sheetname+'!$B:$B$'+str(len(data)),
'name': '='+sheetname+'!$A:$A$'+str(len(data))})
## insert chart into the worksheet
worksheet.insert_chart('C3', chart)
## Close the workbook
workbook.close()
这是图表的屏幕截图:
如果您注意到图表中的图例为 1、2、3 ..。 . 7.它实际上应该说的是品牌名称。如 xlsxwriter
- http://xlsxwriter.readthedocs.io/chart.html 的文档中所述,我已将 name 参数添加到 chart.add_series
。任何帮助将非常感激。
在Excel和XlsxWriter中,饼图中数据点的名称来自"Categories"。这与名称来自系列名称的其他“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()
另外,请注意类别和值使用列表而不是范围字符串。这种可选格式在处理可变数据时更容易,它可以处理任何 sheet 名称引用。
输出:
问题是您的 sheet 名字中有一个 space,例如 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:$A$"+str(len(data)),
'values': "='"+sheetname+"'!$B:$B$"+str(len(data)),
'name': 'My pie chart'})
## insert chart into the worksheet
worksheet.insert_chart('C3', chart)
## Close the workbook
workbook.close()
我有一个包含 6 个选项卡的 excel 文件(worksheets)。每个 worksheet 具有相同的结构并包含两列 - Col 1 包含品牌名称,Col 2 包含与每个品牌对应的值。对于 excel 文件中的每个 sheet,我想制作一个饼图来显示每个品牌的份额百分比。
可用于 运行 脚本的示例 xls 文件是 here
我写的代码很简单,可以生成图表。问题是图表的图例采用序列号名称而不是品牌名称。
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:$A$'+str(len(data)),
'values': '='+sheetname+'!$B:$B$'+str(len(data)),
'name': '='+sheetname+'!$A:$A$'+str(len(data))})
## insert chart into the worksheet
worksheet.insert_chart('C3', chart)
## Close the workbook
workbook.close()
这是图表的屏幕截图:
如果您注意到图表中的图例为 1、2、3 ..。 . 7.它实际上应该说的是品牌名称。如 xlsxwriter
- http://xlsxwriter.readthedocs.io/chart.html 的文档中所述,我已将 name 参数添加到 chart.add_series
。任何帮助将非常感激。
在Excel和XlsxWriter中,饼图中数据点的名称来自"Categories"。这与名称来自系列名称的其他“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()
另外,请注意类别和值使用列表而不是范围字符串。这种可选格式在处理可变数据时更容易,它可以处理任何 sheet 名称引用。
输出:
问题是您的 sheet 名字中有一个 space,例如 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:$A$"+str(len(data)),
'values': "='"+sheetname+"'!$B:$B$"+str(len(data)),
'name': 'My pie chart'})
## insert chart into the worksheet
worksheet.insert_chart('C3', chart)
## Close the workbook
workbook.close()