我编写了以下代码,以使高斯曲线适合直方图。尽管Y缩放比例不同,但似乎可行。我究竟做错了什么?
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab
list = [0,1,1,2,2,2,3,3,4]
plt.figure(1)
plt.hist(list)
plt.xlim((min(list), max(list)))
mean = np.mean(list)
variance = np.var(list)
sigma = np.sqrt(variance)
x = np.linspace(min(list), max(list),100)
plt.plot(x,mlab.normpdf(x,mean,sigma))
plt.show()
谢谢!
您需要对直方图进行归一化,因为您绘制的分布也已归一化:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab
arr = np.random.randn(100)
plt.figure(1)
plt.hist(arr, normed=True)
plt.xlim((min(arr), max(arr)))
mean = np.mean(arr)
variance = np.var(arr)
sigma = np.sqrt(variance)
x = np.linspace(min(arr), max(arr), 100)
plt.plot(x, mlab.normpdf(x, mean, sigma))
plt.show()
请注意对normed=True
的调用plt.hist
。还要注意,我更改了样本数据,因为直方图看起来很奇怪,数据点太少。
如果您想保留原始直方图,而是调整分布,则必须缩放分布,以使分布上的积分等于直方图的积分,即列表中的项目数乘以条形的宽度。可以这样实现
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab
arr = np.random.randn(1000)
plt.figure(1)
result = plt.hist(arr)
plt.xlim((min(arr), max(arr)))
mean = np.mean(arr)
variance = np.var(arr)
sigma = np.sqrt(variance)
x = np.linspace(min(arr), max(arr), 100)
dx = result[1][1] - result[1][0]
scale = len(arr)*dx
plt.plot(x, mlab.normpdf(x, mean, sigma)*scale)
plt.show()
请注意,scale
根据项目数乘以单个条形的宽度计算得出的系数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句