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
相关产品推荐
相关产品推荐

