如何将曲线拟合到python中的直方图

时间:2016-06-02 12:42:18

标签: python curve-fitting

我需要在我的直方图上拟合曲线。它只显示直方图而非曲线拟合。这是我的代码:

from scipy.stats import norm
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
import matplotlib.mlab as mlab



f= np.loadtxt('data Ties', unpack='False')


bins = [0,1000,10000,20000,30000,40000,50000,60000,70000,80000,90000,100000] 


(mu, sigma) = norm.fit(f)

#plt.hist(f, bins=bins, histtype='bar')

plt.hist(f, bins=bins, histtype='bar', normed=True)

y = mlab.normpdf( bins, mu, sigma)
plt.plot(bins,y,'r--', linewidth=1, color='r')

plt.xlabel('Diameter (Micrometer)')
plt.ylabel('Number of Chondrules')
plt.title('Distribution of chondrules diameter')
plt.legend()
plt.grid(True)
plt.show()

它描绘了合适但不是很好的方式。这是我的一个数据:

168000
199300
120900
216900
200800
137800
214200
174600
48200
126500
58700
149500
47500
5600
178500
25400
163000
182000
51900
66700
90300
210600
117800
164000
215200
170000
182000
38800
72700
161200
31000

我也想知道吝啬和西格玛。

enter image description here

1 个答案:

答案 0 :(得分:0)

pdf在图表上,它真的很小。只需查看y

的值
array([  8.83232194e-07,   9.10034504e-07,   1.17854794e-06,
         1.53635735e-06,   1.95663517e-06,   2.43444572e-06,
         2.95912259e-06,   3.51397321e-06,   4.07667940e-06,
         4.62048215e-06,   5.11611925e-06,   5.53435032e-06])

你必须缩放直方图,使其与pdf(或其他方式)相当。最简单的方法是在normed中将True选项设置为plt.hist()

plt.hist(f, bins=bins, histtype='bar', normed=True)

你应该被设置。不幸的是,图表看起来仍然不太好,因为您选择的区域大小对于此数据集并不是特别好。例如,您的箱柜的最大值仍然低于数据的平均值。尝试

bins = np.arange(0, 260000, 20000)

以获得更好看的图表。

如果你想要一个非常好的分布图,我建议尝试一个专门的包,例如seaborn,这使它成为一个单行:

import seaborn as sns
sns.distplot(f, fit=norm, kde=False)
plt.show()

或者如果你想要拟合核密度估计而不是(不是特别合适的)正态分布,它就像

一样简单
sns.distplot(f)
plt.show()