首页 > 解决方案 > Python OpenPyxl:从按列排列的数据创建折线图

问题描述

Excel 中的数据

我正在尝试使用Opepyxl. 目标是有一个折线图,显示第一行中项目的 Std.dev 趋势(gap1MachiSide、Gap1OperatorSide 等);

这是我的代码:

#Create a linechart for std.dev
chart1 = LineChart()
chart1.style = 10

chart1.title = "Gap MC-OP Std.Dev"
chart1.y_axis.title = 'St.Dev [mm]'
chart1.x_axis.title = 'Gap #'


data = Reference(ws2, min_col=2, min_row=3, max_row=3, max_col=35)

chart1.add_data(data)

s1= chart1.series[0]
s1.marker.symbol = "triangle"

chart1.dataLabels = DataLabelList()
chart1.dataLabels.showVal = True
chart1.shape = 30
chart1.width = 35
chart1.height = 7

ws2.add_chart(chart1, "A10")

标签: pythonexcelchartsopenpyxl

解决方案


openpyxl 文档讨论了使用列而不是行中的数据构建图表。我有同样的问题——openpyxl 似乎不支持行中的数据。

Series() 中没有参数来按行而不是按列指定数据。显然,它假定数据在列中,并且在弹出数据系列名称时会丢失有效数据。我没有尝试过,但不使用 title_from_data 参数也可能有效。

对我有用的是在调用 add_data() 或 Series 构造函数之后将 series.val 字段更改为所需的行范围。请注意,使用 title_from_data=True 会将第一个单元格弹出 Reference range_string,将其更改为仅数据单元格范围。

因为 openpyxl 在其内部结构中使用了相当强的类型,所以我需要使用一些类型强制来完成这项工作。

替换这两行:

data = Reference(ws2, min_col=2, min_row=3, max_row=3, max_col=35)
chart1.add_data(data)

用这五行:

from openpyxl.chart.data_source import NumRef, NumDataSource
data = Reference(ws2, min_col=2, min_row=3, max_row=3, max_col=35)   #no change
chart1.add_data(data)                                                #no change
data_range = str(data)
chart1.series[-1].val = NumDataSource(NumRef(data_range))

推荐阅读