2017-09-08 2 views
-1

ich ein Python-Skript erstellt, das eine Reihe von Daten aus einer Datei zeichnet dann paßt es mit einer Gauß'schen Kurve. Das rote Stufenhistogramm ist eine Menge von Daten, deren Mittelwert ich mit einem realen Datenwert vergleichen möchte, der die blaue gestrichelte Linie ist. Die Gaußsche Anpassung ist am unteren Rand des Graphen kaum sichtbar, es ist eine gestrichelte grüne Linie. Ich kann nicht herausfinden, warum der Fit flach ist statt einer Kurve, da der Mittelwert und das Sigma, die berechnet werden, korrekt sind; Sie sind der Titel des Graphen.Gaußsche Anpassung an Histogramm ist flach

Graph

My Source Code

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() 

Antwort

2

finden Sie ein vollständiges, hier zu arbeiten Beispiel aus dem Code angepasst

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() 

Es gibt dieses Bild

enter image description here

Das Problem ist, dass Ihre y ist eine Wahrscheinlichkeitsverteilung, die auf 1 normalisiert, aber Ihr Histogramm ist nicht. So gibt es zwei Möglichkeiten, damit umzugehen:

  • Skala des PDF
  • das Histogramm normalisierte

Die Normalisierung ist im Wesentlichen die Fläche unter der Histogrammkurve, die aus einer numerischen Integration berechnet werden kann . Es wird von

  • Anzahl von Proben
  • Binabmessung

Hinweis betroffen, dass plt.hist kann dies, indem man in der normed=True Option für Sie tun.

+0

Ich machte diese Korrektur, außer jetzt bekomme ich überhaupt keine Gauß'sche Anpassung – Mike