使用 xlwings 将系列标签添加到 Excel 图表

问题描述 投票:0回答:1

我正在尝试使用 Windows 自动执行图表报告分析。

我一直在尝试不同的方法来使用 VBA 记录器添加标签,但没有找到任何有效的方法。如何向 SeriesCollection 或 FullSeriesCollection 添加标签? 假设我有一个使用 Xlwings 创建的功能表

#Create Chart 
chart = sheet.charts.add() 
chart.chart_type = 'xy_scatter_lines' 
chart.api[1].SeriesCollection().NewSeries() 
# Assume I have some data 
x = data_p_sheet.range(f'{col_x}5').expand("down")
y = data_p_sheet.range(f'{col_y}5').expand("down")
chart.api[1].SeriesCollection(1).XValues = x.api
chart.api[1].SeriesCollection(1).Values = y.api 
chart.api[1].FullSeriesCollection(1).Name = "MyChart"

假设我的标签在与 x 和 y 相同的行数范围内

labels =data_p_sheet.range(f'{col_labels}5').expand("down") 
chart.api[1].FullSeriesCollection(1).DataLabels = labels

它不工作也不返回任何错误,所以我不确定这是否是正确的方法。

chart.api[1].FullSeriesCollection(i).ApplyDataLabels() 

上面的代码片段添加了数据标签,但我仍然没有得到我想要的布局。

Schema of how my sheet and data looks like

我试图让 id 列成为每个点的标签。

假设您在其他地方获得 SeriesCollection 索引,我得到了一个无关紧要的解决方案:

for i, label in enumerate(labels):
    i_label=chart.api[1].SeriesCollection(j).DataLabels(i+1)
    i_label.Text = str(label)
python excel charts xlwings
1个回答
0
投票

我无法通过“来自单元格的值”或通过更改标签的值来获取设置标签的代码。然而,并不是所有的图表功能都可以通过 Xlwings 实现。

也许 xlsxwriter 可以供您使用。这样做的选项是在去年左右添加的。

import xlsxwriter

workbook = xlsxwriter.Workbook('scatter_labels.xlsx')
worksheet = workbook.add_worksheet()
sheetname = 'Sheet1'

### Header formatting
header_form = workbook.add_format(
    {
        "border":   6,
        "bold":     True,
        "align":    "center"
    }
)


# Add the worksheet data to be plotted.
data_list = [
    ['id', 'DISTANCE', 'TN'],
    ['S60 PUYR_X006255', 0, 200.259995],
    ['S60_PUYR_X006263', 30.9629993, 200.039993],
    ['S60_PUYR_X006265', 50.132, 199.830002],
    ['S60_PUYR_X006396', 235.852001, 204.660004],
    ['S60_PUYR_X017237', 430.316006, 206.832001],
    ['S56_PUYR_X017238', 430.316006, 206.832001],
    ['S56_PUYR_X006430', 430.963006, 206.832001],
    ['S56_PUYR_X006431', 475.673005, 208.039993]
]

### Add Headers and data to sheet and create labeling list
marker_labels = []
for row, data in enumerate(data_list, 4):
    if row > 4:
        worksheet.write_row(f'A{row}', data)
        marker_labels.append({'value':f'={sheetname}!$A${row}'})
    else:
        worksheet.write_row(f'A{row}', data, header_form)

# Create a new scatter chart object.
chart = workbook.add_chart({'type': 'scatter', "subtype": "straight_with_markers"})

chart.add_series({
    'name':         '=Sheet1!$C$4',
    'categories':   '=Sheet1!$B$5:$B$12',
    'values':       '=Sheet1!$C$5:$C$12',
    'data_labels': {'value': True, 'custom': marker_labels},
})
chart.set_chartarea({'border': {'none': True}})

### Set axis points
chart.set_x_axis({'min': 0, 'max': 500})
chart.set_y_axis({'min': 199, 'max': 209})

### Set Chart size
chart.set_size({'width': 800, 'height': 400})

# Insert the chart into the worksheet at cell F1.
worksheet.insert_chart('F1', chart)

### Auto fit columns
worksheet.autofit()

### Save and close
workbook.close()

这个例子会产生这样的散点图

© www.soinside.com 2019 - 2024. All rights reserved.