如何使用openpyxl为散点图系列添加字母数字类型的数据标签
解决openpyxl散点图自定义数据标签问题
问题原因
你之前触发类型报错,是因为Series构造函数的dLbls参数预期接收DataLabelList类型的标签配置对象,你直接传入了标签列的单元格引用对象,类型不匹配导致报错。
解决方法
只需要两步即可实现A列内容作为数据点标签:
- 给系列指定类别源为A列的单元格引用
- 开启系列的类别标签显示,关闭不需要的默认标签项
具体修改代码
你只需要替换原代码中注释*** WHAT I WANT IS TO ADD "A", "B", "C", etc... as labels to chart points... but HOW? ***的部分,添加以下代码即可:
# 导入需要的标签类 from openpyxl.chart.label import DataLabelList # 给系列指定类别源为A列的标签数据 series_data.cat = chart_ref_l # 配置标签显示规则 series_data.dLbls = DataLabelList() series_data.dLbls.showCatName = True # 开启类别名称显示,也就是A列的内容 series_data.dLbls.showVal = False # 关闭默认的Y值显示 series_data.dLbls.showSerName = False # 关闭系列名称显示
如果想在创建Series时直接指定,也可以把原来创建series的行改成:
series_data = xl.chart.Series(values=chart_ref_y, xvalues=chart_ref_x, cat=chart_ref_l)
效果和单独给series_data.cat赋值完全一致。修改后运行代码,生成的Excel文件中散点图的每个数据点就会显示对应的A列字母标签。
完整修改后代码
import openpyxl as xl from openpyxl.chart.label import DataLabelList # Create workbook and data sheet wb = xl.Workbook() ws = wb.active ws.title = "Data" # Prepare data headers = ["Labels", "X values", "Y values"] data = [["A", "B", "C", "D", "E"], [12, 23, 34, 45, 56], [65, 45, 38, 92, 17]] # Write data in sheet for col in range(1, 4): ws.cell(row=1, column=col).value = headers[col - 1] for row in range(2, 7): ws.cell(row=row, column=col).value = data[col - 1][row - 2] # Select data for chart mr = ws.max_row chart_title = "Scatter chart" chart_ref_x = xl.chart.Reference(ws, min_col=2, min_row=2, max_row=mr) # X values chart_ref_y = xl.chart.Reference(ws, min_col=3, min_row=2, max_row=mr) # Y values chart_ref_l = xl.chart.Reference(ws, min_col=1, min_row=2, max_row=mr) # Data labels # Make scatter chart scatter_chart = xl.chart.ScatterChart() scatter_chart.title = chart_title scatter_chart.x_axis.title = "X values" scatter_chart.y_axis.title = "Y values" scatter_chart.legend = None # Create series series_data = xl.chart.Series(values= chart_ref_y, xvalues= chart_ref_x) series_data.graphicalProperties.line.noFill = True series_data.marker = xl.chart.marker.Marker('diamond') series_data.marker.size = 8 # 自定义标签配置 series_data.cat = chart_ref_l series_data.dLbls = DataLabelList() series_data.dLbls.showCatName = True series_data.dLbls.showVal = False series_data.dLbls.showSerName = False # Add series to chart scatter_chart.series.append(series_data) # Create chartsheet and add chart chart_sheet = wb.create_chartsheet(title="Scatter chart") chart_sheet.add_chart(scatter_chart) # Save workbook wb.save("labels.xlsx") # Close it wb.close()
内容的提问来源于stack exchange,提问作者Dario de Judicibus
相关产品推荐
相关产品推荐

