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

自定义刻度下为Matplotlib子图的条形图添加数值标签

我明白你遇到的问题了——自定义刻度后,条形图的数值标签总是跑错位,对吧?这是因为自定义刻度只是替换了轴上显示的文字,底层的坐标还是基于你设置的ticks数值(比如你这里的1、2、3),直接用数据值定位标签就会和自定义刻度的映射不匹配。咱们直接结合你的代码场景来解决:

先修正子图遍历的小问题

你原来的列表推导式遍历子图有点问题,应该改成这样,避免报错:

for row in axes:
    for subax in row:
        subax.yaxis.set(ticks=range(1,4), ticklabels=['a','b','c'])

核心解决:基于条形的实际坐标放置标签

不管是横向条形图(plt.barh)还是纵向条形图(plt.bar),我们都直接从条形对象本身获取位置信息,完全不受自定义刻度的影响。下面是完整的可运行代码:

import matplotlib.pyplot as plt

fig = plt.figure()
axes = fig.subplots(nrows=2, ncols=2)

# 遍历子图并设置自定义y轴刻度
for row in axes:
    for subax in row:
        subax.yaxis.set(ticks=range(1,4), ticklabels=['a','b','c'])

# 模拟你的4组数据
data = [
    [8, 9, 8],
    [23, 26, 2],
    [33, 37, 31],
    [12, 15, 10]
]

# 给每个子图添加条形图和数值标签
for ax, vals in zip(axes.flat, data):
    # 这里以横向条形图(barh)为例,要做纵向的话看后面的说明
    bars = ax.barh(range(1,4), vals)
    
    # 逐个给条形加标签
    for bar in bars:
        # 获取条形的宽度(也就是对应的数据值)
        bar_width = bar.get_width()
        # 获取条形的垂直中心位置
        bar_y_center = bar.get_y() + bar.get_height() / 2
        # 在条形右侧放置标签,偏移量可以根据数据大小调整
        ax.text(bar_width + 0.5, bar_y_center, f'{int(bar_width)}', va='center')

plt.tight_layout()
plt.show()

如果是纵向条形图(plt.bar)的调整

如果你的子图用的是纵向条形,只需要把添加标签的部分改成下面的代码:

bars = ax.bar(range(1,4), vals)
for bar in bars:
    bar_height = bar.get_height()
    bar_x_center = bar.get_x() + bar.get_width() / 2
    # 在条形顶部放置标签
    ax.text(bar_x_center, bar_height + 0.5, f'{int(bar_height)}', ha='center')

关键注意点

  • 永远用条形对象的get_width()/get_height()和get_x()/get_y()来获取位置,这些值是基于底层坐标的,和自定义刻度的显示文字无关。
  • 标签的偏移量(比如代码里的+0.5)可以根据你的数据范围调整,避免标签和条形重叠。如果是小数数据,把int()去掉或者改成格式化字符串,比如f'{bar_width:.1f}'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:45:28