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

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()

关键说明

  1. 左侧标签调整:通过padding=10让分数标签从红色条形的左边缘向内偏移,贴合inside base需求。
  2. 右侧标签调整:通过padding=-20让分数标签从橙色条形的右边缘向内偏移,贴合inside end需求。
  3. 中心姓名标签:放弃重复绘制bar_label的方式,直接用ax.text()在x=0.5(水平中心)、对应行的y轴位置添加姓名,确保标签始终居中,无需设置透明度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:56:03