openpyxl 图表错误栏样式
openpyxl chart error bar styles
我被分配了一项 "simple" 任务,即收集一系列数据列到结果工作簿。结果工作簿包含必要的公式和图表来分析结果。数据由我在 python 中作为一系列 excel 工作簿编写的图像分析应用程序生成。
现在的问题是 openpyxl 会删除 excel 工作簿中的所有现有图表。我花了一天时间弄清楚如何使用 openpyxl 图表,其中有一些文档和图表错误栏,但没有任何示例。有一个有简短评论的来源..
使用 win32com 扩展将允许直接与 Excel 交互,但显然这将不起作用,除非在 windows 中并且如果安装了 Excel。情况可能并非如此。还试图弄清楚如何以这种方式与 Excel 交互可能需要一段时间,而不是从 VBA 宏中进行交互。
..
对于设置图表样式,有一个相对不错的方法,有点像这样:
valuewidth=openpyxl.utils.units.points_to_pixels(2.25)
valuewidth=openpyxl.utils.units.pixels_to_EMU(valuewidth)
redcolor=openpyxl.drawing.colors.ColorChoice(prstClr="red")
bluecolor=openpyxl.drawing.colors.ColorChoice(prstClr="blue")
xvalues = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.seriesx['column'], min_row=exceldata.seriesx['row'], max_row=exceldata.seriesx['row']+exceldata.seriesx['rows'])
values = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.seriesy['column'], min_row=exceldata.seriesy['row'], max_row=exceldata.seriesy['row']+exceldata.seriesy['rows'])
series = openpyxl.chart.Series(values, xvalues, title_from_data=True)
series.graphicalProperties.line.width=valuewidth
series.graphicalProperties.line.solidFill=bluecolor
chart.series.append(series)
现在要使用误差线,必须像这样定义和创建它们:
errorwidth=openpyxl.utils.units.points_to_pixels(1)
errorwidth=openpyxl.utils.units.pixels_to_EMU(errorwidth)
errorlinetype=openpyxl.drawing.line.LineProperties(w=errorwidth, solidFill=redcolor)
errorline=openpyxl.chart.shapes.GraphicalProperties(ln=errorlinetype)
values = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.lowerlim['column'], min_row=exceldata.lowerlim['row'])
xvalues = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.lower['column'], min_row=exceldata.lower['row'])
chart.title="LL"
errorbar=openpyxl.chart.error_bar.ErrorBars(errBarType="minus",errValType="percentage",val=100.0, spPr=errorline)
errorbar.NumDataRef="LL"
series = openpyxl.chart.Series(values, xvalues, title=None, title_from_data=False)
series.errBars=errorbar
chart.series.append(series)
现在我想知道是否有一种方法可以通过首先定义那些用于创建 GraphicalProperties 对象的 LineProperties 来跳过构建该 spPr 对象,然后在实例化期间将其馈送到 ErrorBars 方法。
NumDataRef 似乎没有做任何事情。它没有记录。
EDIT 在任何情况下,对 NumDataRef 的调用都可能是错误的。 plus 和 minus 参数期望 NumDataSource 是 NumDataRef 的一部分。正确的语法可能又是第一个创建
的两步过程
foo = openpyxl.chart.data_source.NumRef(f="bar")
然后由
跟进
minus = openpyxl.chart.data_source.NumDataSource(numRef="foo")
我不确定 numRef 实际指的是什么,是单元格、系列名称还是其他。
如果有人可以贡献 "plus"、"minus" 和 "val" 参数的作用,那将会很有帮助。
似乎需要 NumVal
、NumData
和 NumDataSource
才能从头开始创建 ErrorBars
:
# References for X and Y
xvalues = Reference(<worksheet>, min_col=<xcol>, min_row=<min>, max_row=<max>)
yvalues = Reference(<worksheet>, min_col=<ycol>, min_row=<min>, max_row=<max>)
plus = [<list of error values for plus>]
minus = [<list of error values for minus>]
# Convert lists of error values to ErrorBars object
errorbars = list2errorbars(plus, minus, errDir='y')
# Create series data and set error bar
series = SeriesFactory(yvalues, xvalues, title="y direction error")
series.errBars = errorbars
def list2errorbars(plus, minus, errDir='y', errValType='cust'):
"Returns ErrorBar from lists of error values"
#Convert to list of NumVal
numvals_plus = [NumVal(i, None, v=x) for i,x in enumerate(plus)]
numvals_minus = [NumVal(i, None, v=x) for i,x in enumerate(minus)]
# Convert to NumData
nd_plus = NumData(pt=numvals_plus)
nd_minus = NumData(pt=numvals_minus)
# Convert to NumDataSource
nds_plus = NumDataSource(numLit=nd_plus)
nds_minus = NumDataSource(numLit=nd_minus)
return ErrorBars(plus=nds_plus, minus=nds_minus, errDir=errDir, errValType=errValType)
完整示例代码:https://github.com/uskysd/openpyxl-errorbar
由于我也找不到好的文档,所以我从源代码中找出来。让我知道是否有更简单的方法来做到这一点。
我被分配了一项 "simple" 任务,即收集一系列数据列到结果工作簿。结果工作簿包含必要的公式和图表来分析结果。数据由我在 python 中作为一系列 excel 工作簿编写的图像分析应用程序生成。
现在的问题是 openpyxl 会删除 excel 工作簿中的所有现有图表。我花了一天时间弄清楚如何使用 openpyxl 图表,其中有一些文档和图表错误栏,但没有任何示例。有一个有简短评论的来源..
使用 win32com 扩展将允许直接与 Excel 交互,但显然这将不起作用,除非在 windows 中并且如果安装了 Excel。情况可能并非如此。还试图弄清楚如何以这种方式与 Excel 交互可能需要一段时间,而不是从 VBA 宏中进行交互。
..
对于设置图表样式,有一个相对不错的方法,有点像这样:
valuewidth=openpyxl.utils.units.points_to_pixels(2.25)
valuewidth=openpyxl.utils.units.pixels_to_EMU(valuewidth)
redcolor=openpyxl.drawing.colors.ColorChoice(prstClr="red")
bluecolor=openpyxl.drawing.colors.ColorChoice(prstClr="blue")
xvalues = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.seriesx['column'], min_row=exceldata.seriesx['row'], max_row=exceldata.seriesx['row']+exceldata.seriesx['rows'])
values = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.seriesy['column'], min_row=exceldata.seriesy['row'], max_row=exceldata.seriesy['row']+exceldata.seriesy['rows'])
series = openpyxl.chart.Series(values, xvalues, title_from_data=True)
series.graphicalProperties.line.width=valuewidth
series.graphicalProperties.line.solidFill=bluecolor
chart.series.append(series)
现在要使用误差线,必须像这样定义和创建它们:
errorwidth=openpyxl.utils.units.points_to_pixels(1)
errorwidth=openpyxl.utils.units.pixels_to_EMU(errorwidth)
errorlinetype=openpyxl.drawing.line.LineProperties(w=errorwidth, solidFill=redcolor)
errorline=openpyxl.chart.shapes.GraphicalProperties(ln=errorlinetype)
values = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.lowerlim['column'], min_row=exceldata.lowerlim['row'])
xvalues = openpyxl.chart.Reference(exceldata.sheetrep, min_col=exceldata.lower['column'], min_row=exceldata.lower['row'])
chart.title="LL"
errorbar=openpyxl.chart.error_bar.ErrorBars(errBarType="minus",errValType="percentage",val=100.0, spPr=errorline)
errorbar.NumDataRef="LL"
series = openpyxl.chart.Series(values, xvalues, title=None, title_from_data=False)
series.errBars=errorbar
chart.series.append(series)
现在我想知道是否有一种方法可以通过首先定义那些用于创建 GraphicalProperties 对象的 LineProperties 来跳过构建该 spPr 对象,然后在实例化期间将其馈送到 ErrorBars 方法。
NumDataRef 似乎没有做任何事情。它没有记录。
EDIT 在任何情况下,对 NumDataRef 的调用都可能是错误的。 plus 和 minus 参数期望 NumDataSource 是 NumDataRef 的一部分。正确的语法可能又是第一个创建
的两步过程foo = openpyxl.chart.data_source.NumRef(f="bar")
然后由
跟进minus = openpyxl.chart.data_source.NumDataSource(numRef="foo")
我不确定 numRef 实际指的是什么,是单元格、系列名称还是其他。 如果有人可以贡献 "plus"、"minus" 和 "val" 参数的作用,那将会很有帮助。
似乎需要 NumVal
、NumData
和 NumDataSource
才能从头开始创建 ErrorBars
:
# References for X and Y
xvalues = Reference(<worksheet>, min_col=<xcol>, min_row=<min>, max_row=<max>)
yvalues = Reference(<worksheet>, min_col=<ycol>, min_row=<min>, max_row=<max>)
plus = [<list of error values for plus>]
minus = [<list of error values for minus>]
# Convert lists of error values to ErrorBars object
errorbars = list2errorbars(plus, minus, errDir='y')
# Create series data and set error bar
series = SeriesFactory(yvalues, xvalues, title="y direction error")
series.errBars = errorbars
def list2errorbars(plus, minus, errDir='y', errValType='cust'):
"Returns ErrorBar from lists of error values"
#Convert to list of NumVal
numvals_plus = [NumVal(i, None, v=x) for i,x in enumerate(plus)]
numvals_minus = [NumVal(i, None, v=x) for i,x in enumerate(minus)]
# Convert to NumData
nd_plus = NumData(pt=numvals_plus)
nd_minus = NumData(pt=numvals_minus)
# Convert to NumDataSource
nds_plus = NumDataSource(numLit=nd_plus)
nds_minus = NumDataSource(numLit=nd_minus)
return ErrorBars(plus=nds_plus, minus=nds_minus, errDir=errDir, errValType=errValType)
完整示例代码:https://github.com/uskysd/openpyxl-errorbar
由于我也找不到好的文档,所以我从源代码中找出来。让我知道是否有更简单的方法来做到这一点。