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

如何将Matplotlib水平条形图的标签移动到对应条形的末端

水平条形图数据标签无法调整到末端的修复方案

问题根因

代码存在重复绘制条形图的逻辑错误:

  • 第一次通过sqldata.plot()绘制的是你实际可见的条形,使用原始金额数值(单位为元,匹配0~35000000的x轴范围),这部分你没有加标签
  • 第二次手动调用ax.barh()绘制的条形使用了除以1e6后的数值(范围仅0~35),和x轴范围相比宽度极小,完全被覆盖不可见
  • 你调用bar_label()是给第二层不可见的条形添加标签,因此调整label_type等参数完全不会生效

修复方案

删除冗余的手动ax.barh()代码,直接获取pandas绘图生成的条形容器添加标签即可,修改后完整代码如下:

'''Create Chart'''
plt.style.use('seaborn-darkgrid')
fig, ax = plt.subplots()

'''Reverse Order of Data Frame'''
sqldata = sqldata.iloc[::-1]
'''Create Chart with reversed dataframe'''
# 保存绘图返回的对象,用于后续获取条形容器
plot_result = sqldata.plot(x='AccountName',y=['t30','t0'],kind='barh', ax=ax)
ax.set_title(f"FIG Cash Sheet {todaydate}")
ax.set_xlabel('Cash')
ax.set_ylabel('Account')
ax.set_xlim(0,35000000)
ax.legend()
plt.ticklabel_format(style='plain', axis='x')
ax.xaxis.set_major_formatter(mmformat)

'''Add bar labels'''
# 遍历两个序列对应的条形组,分别添加格式化标签
for bar_group in plot_result.containers:
    # 将原始金额转换为百万单位格式化
    labels = [f"{bar.get_width() / 1000000:.2f}MM" for bar in bar_group]
    # label_type设为edge即可让标签显示在条形末端,padding调整标签和条形的间距
    ax.bar_label(bar_group, labels=labels, padding=3, label_type='edge')

参数调整说明

  • 增大padding数值可以让标签离条形末端更远
  • 若需要标签显示在条形内部居中位置,将label_type改为center即可
  • 若需要调整标签字体、颜色等属性,可在bar_label()中传入fontsize、color等参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:15:03