Matplotlib堆叠水平条形图:居中索引标签与内侧数值标签实现
堆叠水平条形图自定义标签实现
需求
创建堆叠水平条形图(barh),实现:
- 索引(姓名)标签固定在每行条形中心
- 数值标签显示在条形内侧边缘,对应Excel的
inside end和inside base位置
数据准备
import pandas as pd import matplotlib.pyplot as plt data = {"Names": ["Amy", "Bob", "Chris"], "Scores1": [70, 81, 23], "Scores2": [30, 100, 63]} df = pd.DataFrame(data).set_index("Names") # 按行标准化,使每行堆叠总和为1 df_norm = df.div(df.sum(axis=1), axis=0)
完整解决方案代码
ax = df_norm.plot.barh(stacked=True, width=0.85, color=['r', 'orange']) # 设置图例位置 plt.legend( bbox_to_anchor=(0.5, -0.1), loc="lower center", borderaxespad=0, frameon=False, ncol=2 ) # 隐藏坐标轴,调整x轴范围避免标签截断 ax.axis('off') plt.xlim(-0.05, 1.05) # 左侧数值标签:设置正padding,让标签位于条形内侧左边缘(inside base) plt.bar_label(ax.containers[0], label_type='edge', labels=data["Scores1"], padding=10) # 右侧数值标签:设置负padding,让标签位于条形内侧右边缘(inside end) plt.bar_label(ax.containers[1], label_type='edge', labels=data["Scores2"], padding=-20) # 中心姓名标签:直接在每行水平中心位置添加文本 for y, name in enumerate(data["Names"]): ax.text(0.5, y, name, ha='center', va='center', fontsize=10) plt.tight_layout() plt.show()
关键说明
- 左侧标签调整:通过
padding=10让分数标签从红色条形的左边缘向内偏移,贴合inside base需求。 - 右侧标签调整:通过
padding=-20让分数标签从橙色条形的右边缘向内偏移,贴合inside end需求。 - 中心姓名标签:放弃重复绘制
bar_label的方式,直接用ax.text()在x=0.5(水平中心)、对应行的y轴位置添加姓名,确保标签始终居中,无需设置透明度。
内容的提问来源于stack exchange,提问作者bjwphneb
相关产品推荐
相关产品推荐

