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

为Matplotlib水平条形图添加顶部数值标签的问题

解决水平条形图标签偏移&数值错误的问题

我来帮你搞定这个水平条形图的标签问题!之前你遇到的标签偏移、数值计算错误,大概率是在for循环里没对应好条形的位置和数值,或者对barh的参数逻辑理解有点偏差。下面直接上可运行的代码,再给你拆解关键细节:

完整示例代码

import matplotlib.pyplot as plt
import numpy as np

# 示例数据:分类标签和对应的计数组
categories = ["类别1", "类别2", "类别3", "类别4"]
counts_groups = [
    [12, 25, 18, 30],  # 第一组计数
    [15, 20, 22, 27]   # 第二组计数
]
bar_width = 0.35  # 单个条形的宽度
y_coords = np.arange(len(categories))  # 基础y轴坐标

plt.figure(figsize=(10, 6))

# 循环绘制每组水平条形+添加标签
for idx, counts in enumerate(counts_groups):
    # 计算当前组条形的y位置(避免重叠)
    bar_y = y_coords + idx * bar_width
    # 绘制水平条形图
    bars = plt.barh(bar_y, counts, height=bar_width, label=f"组{idx+1}")
    
    # 为每个条形添加数值标签
    for bar in bars:
        # 获取条形的长度(也就是对应的计数值)
        count_value = bar.get_width()
        # 获取条形的中心y坐标
        bar_center_y = bar.get_y() + bar.get_height() / 2
        # 添加文本标签:位置在条形右侧,垂直居中
        plt.text(
            count_value + 0.5,  # x位置:条形长度+小偏移,避免重叠
            bar_center_y,
            str(count_value),
            ha='left',  # 水平左对齐(因为标签在条形右边)
            va='center'  # 垂直居中
        )

# 设置图表属性
plt.yticks(y_coords + bar_width/2, categories)  # 让y轴标签在两组条形中间
plt.xlabel("计数")
plt.ylabel("类别")
plt.title("带数值标签的多组水平条形图")
plt.legend()
plt.tight_layout()
plt.show()

关键细节拆解

  • 条形位置对齐:用y_coords + idx * bar_width计算每组条形的y位置,确保多组条形不重叠;同时通过yticks把y轴标签放在两组条形中间,视觉更协调。
  • 标签数值准确性:直接调用bar.get_width()获取条形的长度(也就是你要显示的计数值),完全避免手动取数时的索引对应错误,数值绝对准确。
  • 标签位置精准度:
    • bar.get_y() + bar.get_height()/2计算条形的中心y坐标,保证标签垂直居中,不会上下偏移。
    • x位置加0.5的小偏移,是为了让标签和条形之间留空隙,不会挤在一起影响可读性。
  • 对齐方式适配:因为标签在条形右侧,用ha='left'让标签左边缘对齐条形右边缘;va='center'保证垂直方向居中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:13:59