Python使用pyplot绘制直方图的正确方法及两种实现差异问题
两种Matplotlib直方图绘制结果不一致的原因及正确方案
不一致的核心原因
你写的第二种方法逻辑存在两处关键错误,自然和方法1结果不一致:
- 第一步调用
np.histogram(SP[0])时没有指定分箱数,默认只会生成10个分箱的统计结果,和方法1指定的30个分箱统计维度从根源上就不一样 - 第二步调用
plt.hist()时参数逻辑完全错误:plt.hist()的第一个参数应该是原始样本数据,你传入了第一步生成的10个分箱左边界bins[:-1],又强行指定分箱数为30,再搭配10个权重值,相当于把10个统计结果硬塞到30个分箱里,得到的图形完全不反映原始数据的真实分布
两种正确的直方图绘制方案
方案1:直接用plt.hist()一步绘制(最常用)
就是你写的方法1,直接传入原始数据和分箱参数即可,是最简便的写法:
n, bins, patches = plt.hist(SP[0], 30, facecolor='green', alpha=1, histtype='stepfilled')
方案2:先统计分箱再绘制(适合需要提前获取分箱统计值的场景)
如果需要先调用np.histogram完成统计再绘图,要保证分箱数统一,且绘图参数传递正确:
# 第一步统计时就指定和方法1一致的30个分箱 counts, bins = np.histogram(SP[0], bins=30) # 优先用plt.stairs绘制预统计的直方图,逻辑更清晰 plt.stairs(counts, bins, fill=True, facecolor='green', alpha=1) # 如果一定要用plt.hist实现,正确写法如下: # plt.hist(bins[:-1], bins=bins, weights=counts, facecolor='green', alpha=1, histtype='stepfilled')
对齐结果的注意事项
- 要保证两种方法结果完全一致,必须显式指定相同的
bins参数值,np.histogram和plt.hist的默认分箱规则完全一致,只要参数统一就不会出现偏差 - 不要把统计得到的分箱边界当做原始数据传入
plt.hist,避免逻辑混淆
内容的提问来源于stack exchange,提问作者fjd
相关产品推荐
相关产品推荐

