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

如何为Pandas水平堆叠条形图的条形添加百分比标注?

为堆叠水平条形图添加百分比标注

你的DataFrame结构如下:

FunderCode                  
HCPL1   1%  18% 50% 30% 1%
HCPL2   1%  16% 44% 37% 3%
HCPL3   1%  17% 40% 39% 3%
HCPL4   1%  20% 40% 34% 5%

目前没有内置命令可以直接给堆叠条形图添加百分比标注,需要通过matplotlib的API手动实现,以下是具体步骤:


步骤1:预处理数据(转换百分比字符串为数值)

原数据中的百分比是带%的字符串,需要先转为数值类型才能计算位置:

# 移除%符号并转换为浮点型
Piv_age_per = Piv_age_per.replace('%', '', regex=True).astype(float)

步骤2:绘制水平堆叠条形图

注意要生成水平堆叠条形图,需要用kind='barh'(你原代码用的bar是垂直条形图):

import matplotlib.pyplot as plt

# 绘制堆叠条形图并获取轴对象
ax = Piv_age_per.plot(kind='barh', stacked=True, legend=True)
plt.tight_layout()  # 自动调整布局避免标签被截断

步骤3:添加百分比标注

方法一:使用matplotlib 3.4+的bar_label(推荐)

高版本matplotlib提供了bar_label方法,可以快速为堆叠条形添加标注:

# 遍历每个堆叠的条形容器
for container in ax.containers:
    # 为每个条形段添加居中的百分比标注
    ax.bar_label(container, labels=[f'{val}%' for val in container.datavalues], label_type='center')

方法二:兼容低版本matplotlib的手动计算

如果你的matplotlib版本低于3.4,需要手动计算标注位置:

# 遍历每一行数据
for y_pos, row in enumerate(Piv_age_per.values):
    cumulative_width = 0  # 记录累计宽度,用于计算标注位置
    for val in row:
        # 计算标注的x坐标(累计宽度 + 当前条形宽度的一半),y坐标为行索引
        ax.text(cumulative_width + val/2, y_pos, f'{val}%', ha='center', va='center')
        cumulative_width += val

运行以上代码后,就能得到带有百分比标注的水平堆叠条形图,和目标效果一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:05:51