如何使用matplotlib正确地用pdf绘制归一化直方图?

Ein*_*r A 6 python matplotlib histogram

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

mu_true = 0
sigma_true = 0.1 
s = np.random.normal(mu_true, sigma_true, 2000)
Run Code Online (Sandbox Code Playgroud)

然后我将正态分布拟合到数据并计算 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)
Run Code Online (Sandbox Code Playgroud)

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

plt.hist(s, 30, density=True);
plt.plot(points, pdf, color='r')
plt.show() 
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

有什么建议可以绘制真正归一化的直方图和 pdf?

Seaborn distplot 也没有解决问题。

import seaborn as sns
ax = sns.distplot(s)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

J. *_*ick 6

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

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