python - 如何使用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)
解决方案
是什么让你认为它没有标准化?猜测一下,这可能是因为每列的高度扩展到大于 1 的值。但是,这种想法是有缺陷的,因为在归一化的直方图/pdf 中,它下面的总面积应该总和为 1(而不是高度)。当您处理 x 中的小步骤时(就像您一样),小于一,那么列高大于一也就不足为奇了!
您可以在链接的 scipy 示例中清楚地看到这一点:x 值更大(一个数量级),因此它们的 y 值也更小。如果您更改分布以涵盖更广泛的值,您将看到相同的效果。尝试 sigma 10 而不是 0.1,看看会发生什么!
推荐阅读
- java - Json反序列化错误Spring Boot测试 - 无法构造实例
- python-3.x - 如何安装上下文?
- matlab - 使用 Matlab 构建时,OpenCV 无法链接 libtiff
- nativescript - 在 WebView 中填充 HTML 表单
- python - 在减少之前屏蔽一维张量的特定元素
- sql - 从 Postgresql 的视图中选择随机样本
- python - 如何使用 MongoEngine 和 Flask-Login 的会话?
- wsdl - 免费 SOAPUI:如何合成/漂亮打印 REST 项目
- rest - 如何使用 REST API 的 powershell 对德语字符(如 ü)进行编码?
- jquery - 如何在执行 ASP.NET 验证后根据用户输入添加确认对话框?