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

qojgxg4l  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(229)

我正在尝试使用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)
6rqinv9w

6rqinv9w1#

我无法从“单元格中的值”或通过更改标签的值来获取设置标签的代码。然而,并非所有的图表功能都可以使用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()

此示例将生成如下

的散点图
xlsxwriter

相关问题