You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python Xlsxwriter模块解决饼图标签重叠问题

解决Xlsxwriter饼图数据标签重叠问题

我使用Xlsxwriter模块将数据写入Excel并生成饼图时,遇到了数据标签重叠的问题,尤其是占比为0的类别会导致标签拥挤。以下是复现问题的代码:

import xlsxwriter

# Create a workbook and add a worksheet
workbook = xlsxwriter.Workbook('pie_chart.xlsx')
worksheet = workbook.add_worksheet()

# Add the data to the worksheet
data = [84,11,2,0,2]


labels = ['A', 'B', 'C', 'D', 'E']
worksheet.write_column('A1', data)
worksheet.write_column('B1', labels)

# Create a pie chart
pie_chart = workbook.add_chart({'type': 'pie'})
pie_chart.add_series({
    'name': 'Pie Chart',
    'categories': '=Sheet1!$B$1:$B$5',
    'values': '=Sheet1!$A$1:$A$5',
    'data_labels': {'percentage': True},
})


# Insert the pie chart into the worksheet
worksheet.insert_chart('D1', pie_chart)

# # Save the workbook
workbook.close()

可行的解决方法

  • 过滤零值数据:直接移除值为0的类别,这类数据不会贡献有效占比,只会占用图表空间导致标签重叠。
  • 优化标签样式与位置:调整标签字体大小,将标签移至饼图外侧并启用引导线,避免内部拥挤。
  • 合并小占比类别:把占比极低的类别合并为“其他”,简化图表结构的同时避免标签拥挤。

修改后的代码示例(过滤零值+优化标签)

import xlsxwriter

# 创建工作簿和工作表
workbook = xlsxwriter.Workbook('pie_chart_fixed.xlsx')
worksheet = workbook.add_worksheet()

# 原始数据
original_data = [84,11,2,0,2]
original_labels = ['A', 'B', 'C', 'D', 'E']

# 过滤零值条目
filtered_data = []
filtered_labels = []
for val, label in zip(original_data, original_labels):
    if val != 0:
        filtered_data.append(val)
        filtered_labels.append(label)

# 将过滤后的数据写入工作表
worksheet.write_column('A1', filtered_data)
worksheet.write_column('B1', filtered_labels)

# 创建饼图
pie_chart = workbook.add_chart({'type': 'pie'})
pie_chart.add_series({
    'name': 'Pie Chart',
    'categories': f'=Sheet1!$B$1:$B${len(filtered_labels)}',
    'values': f'=Sheet1!$A$1:$A${len(filtered_data)}',
    'data_labels': {
        'percentage': True,
        'font': {'size': 10},  # 缩小字体避免拥挤
        'position': 'outside_end',  # 将标签放在饼图外侧
        'leader_lines': True  # 启用引导线连接标签与对应扇区
    },
})

# 插入图表到工作表
worksheet.insert_chart('D1', pie_chart)

# 保存工作簿
workbook.close()

合并小占比类别的示例代码

如果需要保留小占比数据但避免标签重叠,可以合并占比低于阈值的类别:

import xlsxwriter

workbook = xlsxwriter.Workbook('pie_chart_merged.xlsx')
worksheet = workbook.add_worksheet()

original_data = [84,11,2,0,2]
original_labels = ['A', 'B', 'C', 'D', 'E']
total = sum(original_data)
threshold = 5  # 占比低于5%的类别合并为“其他”
other_value = 0
filtered_data = []
filtered_labels = []

for val, label in zip(original_data, original_labels):
    if val == 0:
        continue
    percentage = (val / total) * 100
    if percentage < threshold:
        other_value += val
    else:
        filtered_data.append(val)
        filtered_labels.append(label)

# 如果有合并的“其他”类别,添加到数据中
if other_value > 0:
    filtered_data.append(other_value)
    filtered_labels.append('其他')

# 写入数据和创建图表的步骤同上
worksheet.write_column('A1', filtered_data)
worksheet.write_column('B1', filtered_labels)

pie_chart = workbook.add_chart({'type': 'pie'})
pie_chart.add_series({
    'name': 'Pie Chart',
    'categories': f'=Sheet1!$B$1:$B${len(filtered_labels)}',
    'values': f'=Sheet1!$A$1:$A${len(filtered_data)}',
    'data_labels': {
        'percentage': True,
        'font': {'size': 10},
        'position': 'outside_end',
        'leader_lines': True
    },
})

worksheet.insert_chart('D1', pie_chart)
workbook.close()

内容的提问来源于stack exchange,提问作者Bhavesh Rathod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:55:29