Python怎么在饼状图中添加百分比和数据标签

Cora
Cora
发布时间:2026-11-01 | 5人浏览过
原创

详细介绍在 Python 中使用 Matplotlib 绘制饼状图时添加百分比和实际数据标签的方法,包含 autopct 格式化字符串、自定义双标签回调函数、距离控制与排版避让技巧。

在 Python 中使用 Matplotlib 绘制饼状图时,默认只会渲染带颜色的扇区,不会主动标注数值或比例。要添加百分比标签,最核心的参数是 plt.pie() 提供的 autopct;若需要同时呈现原始具体数值(例如销售额、人数)与对应百分比,可以通过向 autopct 传递自定义回调函数来反算原始值。结合 pctdistance、labeldistance 与 textprops 等参数,还可以进一步调整标签的摆放位置与视觉样式,从而生成清晰专业的数据图表。

一、使用 autopct 参数快速添加百分比

Matplotlib 的 plt.pie() 函数自带了一个专门用于标注扇区占比的参数:autopct。该参数接受一个字符串格式化模板或一个可调用对象(函数),会自动将各扇区的数值除以总和后计算出百分比并显示在对应扇区内。

最常用的方式是传入标准格式化字符串:

  • autopct='%1.1f%%':保留一位小数并附带百分号(如 35.2%)。
  • autopct='%1.0f%%' 或 autopct='%d%%':显示四舍五入后的整数百分比(如 35%)。
  • autopct='%1.2f%%':保留两位小数(如 35.24%)。

下面是一个标准的最小可运行示例,演示如何构建数据、设置类别标签并添加百分比显示:

import matplotlib.pyplot as plt

# 解决中文显示与负号问题
plt.rcParams['font.sans-serif'] = ['PingFang SC', 'Microsoft YaHei', 'SimHei', 'sans-serif']
plt.rcParams['axes.unicode_minus'] = False

# 1. 准备分类数据
categories = ['电子产品', '日用百货', '服装鞋帽', '生鲜食品']
sales_data = [420, 260, 180, 140]

# 2. 绘制饼图并指定 autopct
plt.figure(figsize=(7, 7))
plt.pie(
    sales_data,
    labels=categories,
    autopct='%1.1f%%',
    startangle=90,
    colors=['#456581', '#438A80', '#74A4BC', '#E09F67']
)

plt.title('季度商品销售额分布', fontsize=14, pad=16)
plt.tight_layout()
plt.show()
Python怎么在饼状图中添加百分比和数据标签
图 1:使用 Matplotlib 添加百分比标签的核心步骤流程

二、同时显示原始数值与百分比标签(双标签技巧)

在业务汇报或报表可视化中,读者往往既需要知道某一项所占的相对比例,也需要直观掌握具体的绝对数值(例如“420 件 (42.0%)”)。然而 autopct 默认只将计算后的浮点百分比(即 0 到 100 之间的数值)传入格式化流程中,直接写模板字符串无法取回原数据。

要解决这个问题,可以将 autopct 赋值为一个自定义函数。Matplotlib 会为每个扇区执行一次该函数,传入当前扇区的百分比 pct。我们在函数内部利用预先计算好的总和 total,反算出原始数值:val = round(pct * total / 100.0),最后返回包含两个维度的字符串。

import matplotlib.pyplot as plt

categories = ['华东', '华南', '华北', '西部']
values = [350, 250, 200, 200]
total_sum = sum(values)

# 定义双标签格式化生成器
def make_autopct(vals):
    total = sum(vals)
    def my_autopct(pct):
        # 根据百分比与总数反算实际绝对值
        val = int(round(pct * total / 100.0))
        # 返回格式化后的字符串:数值换行附带百分比
        return f"{val}\n({pct:.1f}%)"
    return my_autopct

plt.figure(figsize=(8, 8))
plt.pie(
    values,
    labels=categories,
    autopct=make_autopct(values),
    startangle=140,
    pctdistance=0.7,
    colors=['#456581', '#438A80', '#5B8FB9', '#B6C99B'],
    textprops={'fontsize': 11}
)

plt.title('各大区销售量与占比分布(双标签)', fontsize=14, pad=20)
plt.show()
Python怎么在饼状图中添加百分比和数据标签
图 2:autopct 回调函数反算原始数值并组装双标签的数据流向

三、标签位置与排版优化:解决遮挡与拥挤

当饼图扇区数量较多,或者存在面积较小的切片时,标签很容易发生重叠、超出饼图边缘或遮挡图例。Matplotlib 提供了几个关键几何控制参数用于精细微调:

  • pctdistance(百分比标签距离圆心的比例):默认约为 0.6。当设为 0.75 时,百分比会更靠近扇区外边缘;若设为 0.5,则会更向圆心收拢。如果制作环形图(Donut Chart),建议将该值适当调大以避开中央空白。
  • labeldistance(分类名称距离圆心的比例):默认约为 1.1。大于 1.0 表示文本位于饼图圆形区域的外围;若设为 0.7 则会将分类名称直接画在扇区内部。
  • textprops(文字属性字典):可以控制标签的字体大小 fontsize、颜色 color、粗细 weight 等。例如 textprops={'fontsize': 10, 'color': '#1E293B'}。
  • explode(扇区外移偏离量):对需要重点强调或面积较小的切片设置微小的径向偏移(如 explode=(0.05, 0, 0, 0)),能有效拉开标签间距。
Python怎么在饼状图中添加百分比和数据标签
图 3:饼图各标签相对于圆心的几何半径比例与调优建议

四、高级排版代码示例:结合 explode 与色彩定制

结合上述参数,我们可以写出一个结构更严谨、视觉层次清晰的完整绘图脚本。下面的示例对占比最高的扇区进行微小弹出(explode),并同时对类别标签和百分比数值设置差异化的字体风格:

import matplotlib.pyplot as plt

# 业务数据
brands = ['品牌 A', '品牌 B', '品牌 C', '品牌 D', '其他']
shares = [38, 26, 18, 12, 6]

# 设置重点突出的扇区(品牌 A 突出 0.06)
explode_settings = (0.06, 0, 0, 0, 0)

# 配色方案(使用沉稳的高对比色彩)
colors = ['#456581', '#438A80', '#5B8FB9', '#82B29A', '#D1D5DB']

fig, ax = plt.subplots(figsize=(8, 8))

# 绘制并接收返回值以便微调
wedges, texts, autotexts = ax.pie(
    shares,
    labels=brands,
    autopct='%1.1f%%',
    startangle=120,
    explode=explode_settings,
    pctdistance=0.72,
    labeldistance=1.12,
    colors=colors,
    textprops={'fontsize': 11, 'color': '#1E293B'},
    wedgeprops={'edgecolor': 'white', 'linewidth': 1.5, 'antialiased': True}
)

# 遍历微调内部百分比文字样式
for at in autotexts:
    at.set_color('#FFFFFF')      # 内部百分比设为白色
    at.set_weight('bold')         # 加粗显示
    at.set_fontsize(10.5)

ax.set_title('各品牌市场占有率对比', fontsize=15, pad=24, fontweight='bold')
plt.tight_layout()
plt.show()

返回值说明:ax.pie() 会返回一个三元组 (wedges, texts, autotexts)。其中 wedges 是各扇区的几何 Patch 对象,texts 是外圈类别标签 Text 对象列表,而 autotexts 则是内圈百分比数值 Text 对象列表。通过循环 autotexts,你可以为每个数值文本单独设置字体颜色、描边或加粗效果。

五、常见问题与注意事项

常见问题 具体原因 推荐解决方案
中文标签显示为方块或乱码 系统默认字体库中缺少中文字体支持 在绘图前显式指定 plt.rcParams['font.sans-serif'] = ['PingFang SC', 'Microsoft YaHei', 'SimHei'],并开启 axes.unicode_minus = False。
百分比加总显示不是 100%(例如 99.9% 或 100.1%) 各扇区浮点数四舍五入后产生的精度积累误差 保留 1~2 位小数可显著减轻感知差异;如业务要求严格相加为 100%,可在自定义 autopct 函数中做差值修正补齐。
极小扇区标签叠在一起无法辨识 切片角度过小,标签坐标物理距离过于接近 将低于阈值(如小于 3%)的项归入“其他”类;或改用柱状图/条形图进行表达。
深色扇区内黑色文字辨识度差 默认 autopct 文本使用黑色文字 通过遍历 autotexts 将文字颜色统一修改为 #FFFFFF,或在 textprops 中预设对比色。

六、知识总结与参数速查

为饼状图添加百分比与标签并不复杂,核心在于根据实际业务受众选择合适的表达方式:

  1. 常规单百分比需求:直接使用 autopct='%1.1f%%',几行代码即可满足大多数探索性数据分析。
  2. 精细化双标签需求:使用闭包函数结构自定义 autopct,把总和引入函数体,反求整数绝对值并拼接。
  3. 视觉版式调优:善用 (wedges, texts, autotexts) 返回值与 pctdistance 半径微调,让图表兼顾美观与高可读性。
Python怎么在饼状图中添加百分比和数据标签
图 4:Python 饼状图百分比与数据标签各功能模块总结速查
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表