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.

8
demandé sur Edwin 2012-01-27 20:02:55

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

enter image description here

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 )

10
répondu Joe Kington 2012-01-27 16:40:17

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.

8
répondu James 2012-01-27 18:26:23