首页 > 解决方案 > 如何使用matplotlib正确绘制带有pdf的标准化直方图?

问题描述

我尝试使用numpy.random.normal 文档中的示例绘制标准化直方图。为此,我生成正态分布的随机样本。

mu_true = 0
sigma_true = 0.1 
s = np.random.normal(mu_true, sigma_true, 2000)

然后我将正态分布拟合到数据并计算pdf。

mu, sigma = stats.norm.fit(s)
points = np.linspace(stats.norm.ppf(0.01,loc=mu,scale=sigma),
                 stats.norm.ppf(0.9999,loc=mu,scale=sigma),100)
pdf = stats.norm.pdf(points,loc=mu,scale=sigma)

显示拟合的 pdf 和数据直方图。

plt.hist(s, 30, density=True);
plt.plot(points, pdf, color='r')
plt.show() 

我使用density=True,但很明显 pdf 和 histogram 没有标准化。

在此处输入图像描述

有人可以建议绘制真正标准化的直方图和 pdf 吗?

Seaborn distplot 也不能​​解决问题。

import seaborn as sns
ax = sns.distplot(s)

在此处输入图像描述

标签: pythonmatplotlibhistogram

解决方案


是什么让你认为它没有标准化?猜测一下,这可能是因为每列的高度扩展到大于 1 的值。但是,这种想法是有缺陷的,因为在归一化的直方图/pdf 中,它下面的总面积应该总和为 1(而不是高度)。当您处理 x 中的小步骤时(就像您一样),小于一,那么列高大于一也就不足为奇了!

您可以在链接的 scipy 示例中清楚地看到这一点:x 值更大(一个数量级),因此它们的 y 值也更小。如果您更改分布以涵盖更广泛的值,您将看到相同的效果。尝试 sigma 10 而不是 0.1,看看会发生什么!


推荐阅读