2017-09-08 78 views
-1

我創建了一個python腳本,它繪製文件中的一行數據,然後用高斯曲線擬合它。紅色的步驟直方圖是一組數據,其平均值我想與實際數據值進行比較,這是一條藍色的虛線。高斯擬合在圖的底部幾乎不可見,它是一條綠色虛線。由於所計算的均值和西格瑪是正確的,我無法找出爲什麼擬合是平的而不是曲線。他們是圖表的標題。高斯擬合直方圖是平的

Graph

我的源代碼

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


    df = numpy.loadtxt('CR_count_TAL=0.10472.dat',dtype='str') 

    for num in range(1): 
     nu=df[num].astype('float') 
     data = nu[1] 
     mc=df[2:numpy.size(nu)] 
     #plot the MC distribution 
     #hist(nu[2:size(nu)],bins=100,color='r',range=(100,500),histtype='step') 

     #plot the dataline 
     axvline(data,color='b',linewidth=2, linestyle='--') 
     #fit a gaussian 
     #(mu, sigma) = norm.fit(nu) 
     plt.hist(nu[2:size(nu)],bins=100,color='r',range=(100,500),histtype='step') 
     y = mlab.normpdf(bins, mu, sigma) 
     l = plt.plot(bins, y, 'g', linewidth = 2, linestyle='--') 

     plt.title(r'$\ \mu=%.3f,\ \sigma=%.3f$' %(mu, sigma)) 
     plt.show() 

回答

2

請在這裏看到一個完整的工作示例,改編自代碼

import numpy as np                 
import matplotlib.pyplot as plt              
import matplotlib.mlab as mlab              

mu = 100                   
sigma = 20                   
n_sample = 3000                  

data = np.random.normal(mu, sigma, n_sample)          

# plot the data                
_, bins, _ = plt.hist(data, bins=100, color='r', range=(50, 150), 
         histtype='step', normed=True)                      
# plot the gaussian PDF                
y = mlab.normpdf(bins, mu, sigma)             
plt.plot(bins, y, 'g', linewidth=2, linestyle='--')         
plt.axvline(mu, color='b', linewidth=2, linestyle='--')                       
plt.title(r'$\ \mu=%.3f,\ \sigma=%.3f$' % (mu, sigma))        
plt.show() 

它給這幅畫

enter image description here

問題是您的y是歸一化爲1的概率分佈,但您的直方圖不是。因此,有兩種方法來對付它:

  • 規模PDF
  • 規範化直方圖

正常化基本上直方圖曲線下面積,這可以從一個數值積分來計算。它是由

  • 樣本數
  • 窗口尺寸

注意plt.hist可以通過傳遞normed=True選項爲你做這個的影響。

+0

我做了這個修正,除了現在我沒有得到高斯擬合 – Mike