python - 在直方图上准确绘制密度曲线,无需归一化
问题描述
我需要在直方图上绘制密度曲线,以条形的实际高度(实际频率)作为 y 轴。
Try1:我在这里 找到了一个相关的答案,但是它已将直方图标准化为曲线的范围。
下面是我的代码和输出。
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
from scipy.stats import norm
data = [125.36, 126.66, 130.28, 133.74, 126.92, 120.85, 119.42, 128.61, 123.53, 130.15, 126.02, 116.65, 125.24, 126.84,
125.95, 114.41, 138.62, 127.4, 127.59, 123.57, 133.76, 124.6, 113.48, 128.6, 121.04, 119.42, 120.83, 136.53, 120.4,
136.58, 121.73, 132.72, 109.25, 125.42, 117.67, 124.01, 118.74, 128.99, 131.11, 112.27, 118.76, 119.15, 122.42,
122.22, 134.71, 126.22, 130.33, 120.52, 126.88, 117.4]
(mu, sigma) = norm.fit(data)
x = np.linspace(min(data), max(data), 100)
plt.hist(data, bins=12, normed=True)
plt.plot(x, mlab.normpdf(x, mu, sigma))
plt.show()
Try2: @DavidG提供了一个选项,一个用户定义的函数,即使它不能准确地覆盖直方图的密度。
def gauss_function(x, a, x0, sigma):
return a * np.exp(-(x - x0) ** 2 / (2 * sigma ** 2))
test = gauss_function(x, max(data), mu, sigma)
plt.hist(data, bins=12)
plt.plot(x, test)
plt.show()
结果是, 但实际的直方图在下方,其中 Y 轴的范围从 0 到 8, 我想在上面精确地绘制密度曲线。在这方面的任何帮助将不胜感激。
解决方案
这是你要找的吗?我将 pdf 乘以直方图的面积。
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
data = [125.36, 126.66, 130.28, 133.74, 126.92, 120.85, 119.42, 128.61, 123.53, 130.15, 126.02, 116.65, 125.24, 126.84,
125.95, 114.41, 138.62, 127.4, 127.59, 123.57, 133.76, 124.6, 113.48, 128.6, 121.04, 119.42, 120.83, 136.53, 120.4,
136.58, 121.73, 132.72, 109.25, 125.42, 117.67, 124.01, 118.74, 128.99, 131.11, 112.27, 118.76, 119.15, 122.42,
122.22, 134.71, 126.22, 130.33, 120.52, 126.88, 117.4]
(mu, sigma) = norm.fit(data)
x = np.linspace(min(data), max(data), 100)
values, bins, _ = plt.hist(data, bins=12)
area = sum(np.diff(bins) * values)
plt.plot(x, norm.pdf(x, mu, sigma) * area, 'r')
plt.show()
结果:
推荐阅读
- android - NativeScript Http Post 请求被阻止
- spring - SpringSecurity configure() 方法配置问题
- firebase - 如何防止大字符串被更新到 Firebase 数据库
- python - 连续过度放松
- python - regex - 在 Python 3 中使用正则表达式制作分词器
- c# - 在 c# 中睡眠一个方法而不是整个程序
- java - 通过java中的setter和getter访问内部方法中的值
- spring-boot - 我在 Spring Boot 中使用 @Autowired 接口服务返回 null
- arduino - Pi to Feather 蓝牙低功耗通信
- python - 合并排序 1 个数组,对于每个更改,它必须影响另一个列表