plt.hist设置density=True不生效,直方图高度异常求助
直方图归一化问题分析与解决
首先明确:plt.hist()的density=True参数,作用是让直方图所有柱子的面积总和为1(概率密度归一化),而非柱子高度之和为1——这是很多人容易踩的误解点。
如果你要的是「高度代表频率占比」
如果你的预期是每个柱子高度对应该区间数据的占比(高度总和为1),别用density=True,改用weights参数实现:
import numpy as np import matplotlib.pyplot as plt data = np.loadtxt("../data/data_queue_R" + str(64) + "_" + str(1) + ".txt") # 生成与数据长度一致的权重,让每个样本的权重为1/总样本数 plt.hist(data, bins=40, weights=np.ones_like(data)/len(data)) plt.show()
验证density=True的正确性
如果确实需要概率密度归一化(面积总和为1),可以手动验证结果是否正确:
counts, bins, patches = plt.hist(data, bins=40, density=True) # 计算所有柱子的面积之和 total_area = np.sum(counts * np.diff(bins)) print(total_area) # 输出应接近1,说明归一化生效
额外排查建议
- 先打印数据的基础统计值(比如
print(np.min(data), np.max(data), np.mean(data))),确认数据分布本身是否符合你的预期,排除数据读取或来源的问题。 - 给直方图加上柱子边框,能更清晰区分区间:
plt.hist(data, bins=40, density=True, edgecolor='black')
内容的提问来源于stack exchange,提问作者a_confused_student
相关产品推荐
相关产品推荐

