Python matplotlib绘制直方图时bins与数组类别不匹配问题求助
问题解决方法
问题根源
你直接给hist方法传入bins = 17时,matplotlib会自动在你的数据取值范围(700~1090)内划分17个等宽区间,每个区间宽度约为22.94,远大于不同权重值的间隔,会导致多个权重值被归入同一个bin,最终统计的计数不符合预期。
解决逻辑
要实现每个权重类别对应单独一个bin,你需要手动指定bin的边界,让每个bin恰好只容纳对应类别的权重值:
- 先提取所有唯一的权重值并排序
- 以每个值±0.5作为对应bin的左右边界,保证整数值不会跨区间落入多个bin
修改后可运行代码
from matplotlib import pyplot as plt import numpy as np # 数据集 weights = np.array([901, 870, 970, 790, 1090, 960, 980, 820, 840, 890, 1010, 920, 700, 880, 910, 890, 790, 810, 990, 750]) # 生成自定义bins:每个唯一权重值对应一个bin unique_weights = np.sort(np.unique(weights)) bins = np.concatenate([unique_weights - 0.5, [unique_weights[-1] + 0.5]]) # 绘制直方图 fig, ax = plt.subplots(figsize =(10, 7)) ax.hist(weights, bins = bins) plt.axis([700,1091,0,2]) # 显示图表 plt.show()
运行后每个权重类别会对应单独的柱子,重复值对应的柱子高度为2,其余为1,符合预期。如果你是按自定义规则划分17个类别,只需把上述bins替换为你自己定义的17个区间的边界数组即可。
内容的提问来源于stack exchange,提问作者Margaux
相关产品推荐
相关产品推荐

