如何为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
相关产品推荐
相关产品推荐

