使用MatPlotLib和Numpy将高斯拟合到直方图 – 错误的Y缩放?
发布时间:2020-12-20 12:24:31 所属栏目:Python 来源:网络整理
导读:我编写了下面的代码,以使高斯曲线适合直方图.它似乎有效,虽然Y缩放是不同的.我究竟做错了什么? import matplotlib.pyplot as pltimport numpy as npimport matplotlib.mlab as mlablist = [0,1,2,3,4]plt.figure(1)plt.hist(list)plt.xlim((min(list),max(l
我编写了下面的代码,以使高斯曲线适合直方图.它似乎有效,虽然Y缩放是不同的.我究竟做错了什么?
import matplotlib.pyplot as plt import numpy as np import matplotlib.mlab as mlab list = [0,1,2,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),sigma)) plt.show() 注意对plt.hist的调用中的normed = 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),100) dx = result[1][1] - result[1][0] scale = len(arr)*dx plt.plot(x,sigma)*scale) plt.show() 请注意根据项目数乘以单个条形宽度计算的比例因子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |