你需要对直方图进行归一化处理,因为你绘制的分布也是经过归一化的:
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, density=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()
请注意在调用 plt.hist
时的 density=True
。另外请注意我更改了您的样本数据,因为带有太少数据点的直方图看起来很奇怪。
如果您希望保留原始的直方图并调整分布,则需要对分布进行缩放,使得分布的积分等于直方图的积分,即列表中物品的数量乘以条形宽度。可以通过以下方式实现:
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
。