2011-08-08 4 views
1

J'ai cet histogramme qui compte le tableau "d" dans des groupes log-espacés également.Comment normaliser un histogramme

max_val=np.log10(max(d)) 
min_val=np.log10(min(d)) 
logspace = np.logspace(min_val, max_val, 50) 


hist(d,bins=logspace,label='z='+str(redshift),histtype='step') 
show() 

Le problème est que je veux que ce soit normalisé pour que la zone soit une. En utilisant l'option Normed = True, je n'ai pas obtenu le résultat, c'est peut-être dû au fait que j'utilise des cases logarithmiques. J'ai donc essayé normalisant l'histogramme de cette façon:

H=hist(d,bins=logspace,label='z='+str(redshift),histtype='step') 
H_norm=H[0]/my_norm_constant 

Mais alors je ne sais pas comment tracer H_norm par rapport aux bacs

+0

vous ne savez pas quoi? – joaquin

Répondre

2

J'ai essayé normé = True, et la région est de 1:

from pylab import * 
d = np.random.normal(loc=20, size=10000) 
max_val=np.log10(max(d)) 
min_val=np.log10(min(d)) 
logspace = np.logspace(min_val, max_val, 50) 


r = hist(d,bins=logspace,histtype='step', normed=True) 
print "area":, sum(np.diff(r[1])*r[0]) 

pouvez-vous exécuter le code et vérifier la sortie. Si ce n'est pas 1, vérifiez votre version numpy. J'ai reçu ce message d'avertissement lorsque exécutez le code:

C: \ Python26 \ lib \ site-packages \ matplotlib \ axes.py: 7680: UserWarning: Cette version corrige un bug de normalisation dans la fonction histogramme NumPy avant version 1.5, se produisant avec des largeurs de bac non uniformes . La valeur retournée et tracée est maintenant une densité: n/(N * largeur de bac), où n est le nombre de bacs et N le nombre total de points.

pour tracer le graphique vous:

step(r[1][1:], r[0]/my_norm_constant) 
+1

ok, mais ma question était de savoir comment diviser ce qui est pour vous r [0] pour une certaine constante, puis tracer cela en fonction des bacs. – Brian

+1

J'ai modifié la réponse, utilisez step() pour tracer. – HYRY

+0

Merci, ça a marché! :) – Brian

1

Il utilise la normalisation commune qui normalise la hauteur du bac d'ajouter jusqu'à 1, quelle que soit la largeur du bac.

import matplotlib 
import numpy as np 

x = [0.1,0.2,0.04,0.05,0.05,0.06,0.07,0.11,0.12,0.12,0.1414,\ 
    0.1415,0.15,0.12,0.123,0,0.14,0.145,0.15,0.156,0.12,0.15,\ 
    0.156,0.166,0.151,0.124, 0.12,0.124,0.12,0.045,0.124] 

weights = np.ones_like(x)/float(len(x)) 
p=plt.hist(x, 
    bins=4, 
    normed=False, 
    weights=weights, 
    #histtype='stepfilled', 
    color=[0.1,0.4,0.3] 
) 

plt.ylim(0,1) 
plt.show() 

resulting histogram plot: