【问题标题】:xlsxwriter - legend for Excel pie Chart - pythonxlsxwriter - Excel 饼图的图例 - python
【发布时间】:2017-03-31 02:20:22
【问题描述】:

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

可用于运行脚本的示例 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$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()

这是图表的屏幕截图:

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

【问题讨论】:

  • 介意分享您的数据框样本df
  • @JulienMarrec 让我把它放在一起分享。
  • 我已经分享了一个 Excel 文件的链接。您可以使用它来运行脚本。
  • @JulienMarrec 运气好吗?

标签: python excel pandas xlsxwriter


【解决方案1】:

问题是您的工作表名称中有一个空格,例如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()

【讨论】:

  • 太棒了!那行得通 - 你能解释一下 "='"+sheetname+"'!$A$1:$A$" 的计算结果吗?
  • print("='"+sheetname+"'!$A$1:$A$"+str(len(data))) 添加到循环中,您会看到它的计算结果为例如='Sheet 1'!$A$1:$A$7。与选择该数据时在 Excel 中的显示方式相同,如果有空格,则会在工作表名称周围添加单引号
  • 再次感谢 - 很棒的收获 - 如果有的话,我暂时不会想到这一点!什么让我的山羊是,如果没有更早地评估确切的工作表名称,那么为什么程序仍在创建图表?
  • 这是百万美元的问题,不是吗?我推测这在使用 xlsxwriter api 创建图表时有效,因为它在 python 生态系统中正确评估。然后,当您在 Excel 中打开链接时,链接会中断
【解决方案2】:

在 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()

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

输出:

【讨论】:

  • 但我确实将类别指向了名称: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))})。即使我删除了name 参数,我也会得到相同的结果!
  • 那么它应该可以工作,正如我在示例中所展示的那样。尝试省略 name 范围,它应该只是一个点。
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2019-06-10
  • 1970-01-01
  • 2017-10-24
相关资源
最近更新 更多