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

Matplotlib直方图bins偏移问题及数据标签添加技术咨询

解决Matplotlib直方图bins偏移及添加数据标签的问题

嘿,我来帮你搞定这两个Matplotlib直方图的问题!咱们一步步来:

1. 修复bins偏移问题

你遇到的偏移是因为plt.hist()默认会自动划分连续区间,但你的数据是离散的整数1.0-5.0,所以得手动设置bins的边界,让每个bin刚好包裹一个整数:

设置bins = [0.5, 1.5, 2.5, 3.5, 4.5, 5.5],这样每个区间的中心刚好对应1.0、2.0...5.0,柱子就会精准对齐这些数值啦。同时可以强制x轴只显示1-5的刻度,让图表更直观。

2. 添加总数和相对数量的数据标签

要添加标签,咱们需要先获取直方图的统计结果(每个bin的数量),然后循环每个柱子,在顶部标注总数和占比。具体做法是:

  • 先计算所有样本的总数
  • 遍历每个柱子,获取它的高度(即该类别的数量)
  • 用plt.text()在柱子顶部居中位置分别添加总数和百分比标签

完整代码示例

import matplotlib.pyplot as plt
import pandas as pd

# 模拟你的数据集(你可以替换成自己的df)
data = {
    'overall': [5.0]*108602 + [4.0]*39974 + [3.0]*21436 + [1.0]*13269 + [2.0]*11059
}
df = pd.DataFrame(data)

# 配置bins,解决偏移问题
bins = [0.5, 1.5, 2.5, 3.5, 4.5, 5.5]
# 绘制直方图,同时获取每个bin的数量、边界和柱子对象
n, bins, patches = plt.hist(df['overall'], bins=bins, edgecolor='black')

# 设置坐标轴和刻度
plt.xlabel('Class')
plt.ylabel('Amount')
plt.xticks([1, 2, 3, 4, 5])  # 强制显示1-5的刻度

# 添加数据标签
total_samples = sum(n)
for idx, patch in enumerate(patches):
    count = int(n[idx])
    height = patch.get_height()
    # 标注总数(在柱子顶部)
    plt.text(
        patch.get_x() + patch.get_width()/2,  # 水平居中
        height,  # 垂直位置在柱子顶部
        f'{count}',
        ha='center', va='bottom'
    )
    # 标注相对占比(在总数标签上方,避免重叠)
    percentage = (count / total_samples) * 100
    plt.text(
        patch.get_x() + patch.get_width()/2,
        height + 1000,  # 偏移量可根据数据调整
        f'{percentage:.1f}%',
        ha='center', va='bottom'
    )

plt.tight_layout()  # 自动调整布局,避免标签被截断
plt.show()

代码说明

  • bins设置:每个区间左边界比整数小0.5,右边界大0.5,确保每个整数落在bin的中心,彻底解决偏移。
  • 数据标签:ha='center'和va='bottom'保证文本水平居中、垂直对齐在柱子顶部;百分比保留1位小数,你可以根据需求调整.1f的位数。
  • 偏移量:height + 1000是为了让百分比标签和总数标签不重叠,你可以根据自己数据的数值大小调整这个值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:17:53