Python: histogramme avec une zone normalisée à quelque chose d'autre que 1
y a-t-il un moyen de dire à matplotlib de" normaliser " un histogramme de telle sorte que sa surface égale une valeur spécifiée (autre que 1)?
l'option "normed = 0 "dans
n, bins, patches = plt.hist(x, 50, normed=0, histtype='stepfilled')
ramène juste à une distribution de fréquence.
2 réponses
calculez-le et normalisez-le à la valeur que vous voulez, puis utilisez bar
pour tracer l'histogramme.
sur une note latérale, cela normalisera les choses telles que la zone de toutes les barres est normed_value
. La somme brute sera pas être normed_value
(bien qu'il soit facile d'avoir que ce soit le cas, si vous voulez).
E. G.
import numpy as np
import matplotlib.pyplot as plt
x = np.random.random(100)
normed_value = 2
hist, bins = np.histogram(x, bins=20, density=True)
widths = np.diff(bins)
hist *= normed_value
plt.bar(bins[:-1], hist, widths)
plt.show()
donc, dans ce cas, si nous devions intégrer (somme la hauteur multipliée par la largeur) les bacs, nous obtiendrions 2.0 au lieu de 1.0. (c'est à dire (hist * widths).sum()
donnera 2.0
)
vous pouvez passer un argument weights
à hist
au lieu d'utiliser normed
. Par exemple, si vos bacs couvrent l'intervalle [minval, maxval]
, vous avez des bacs n
, et vous voulez normaliser la zone à A
, alors je pense
weights = np.empty_like(x)
weights.fill(A * n / (maxval-minval) / x.size)
plt.hist(x, bins=n, range=(minval, maxval), weights=weights)
devrait faire l'affaire.
EDIT: l'argument weights
doit avoir la même taille que x
, et son effet est de faire contribuer chaque valeur de x à la valeur correspondante valeur dans weights
vers le compte bin, au lieu de 1.
je pense que la fonction hist
pourrait probablement faire avec une plus grande capacité de contrôler la normalisation, cependant. Par exemple, je pense que dans l'état actuel des choses, les valeurs en dehors de la plage de binned sont ignorées lors de la normalisation, ce qui n'est généralement pas ce que vous voulez.