tutorial pyplot normalized histograma hist example python numpy matplotlib scipy

python - pyplot - pandas histogram



Histograma Matplotlib (5)

Creo que esto podría ser útil para alguien.

La función de histograma de Numpy, para mi molestia (aunque, aprecio que haya una buena razón para ello), devuelve los bordes de cada contenedor, en lugar del valor del contenedor. Mientras que esto tiene sentido para los números de punto flotante, que pueden estar dentro de un intervalo (es decir, el valor central no es muy significativo), este no es el resultado deseado cuando se trata de valores discretos o enteros (0, 1, 2, etc.) . En particular, la longitud de los contenedores devueltos desde np.histogram no es igual a la longitud de los recuentos / densidad.

Para evitar esto, utilicé np.digitize para cuantizar la entrada, y devolver un número discreto de contenedores, junto con la fracción de conteos para cada contenedor. Puede editar fácilmente para obtener el número entero de conteos.

def compute_PMF(data) import numpy as np from collections import Counter _, bins = np.histogram(data, bins=''auto'', range=(data.min(), data.max()), density=False) h = Counter(np.digitize(data,bins) - 1) weights = np.asarray(list(h.values())) weights = weights / weights.sum() values = np.asarray(list(h.keys())) return weights, values ####

Refs:

[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html

[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html

Entonces tengo un pequeño problema. Tengo un conjunto de datos en scipy que ya está en formato de histograma, así que tengo el centro de los contenedores y el número de eventos por contenedor. ¿Cómo puedo ahora trazar es como un histograma? Intenté simplemente hacer

bins, n=hist()

pero no me gustó eso. ¿Alguna recomendación?


Sé que esto no responde a su pregunta, pero siempre termino en esta página, cuando busco la solución matplotlib para histogramas, porque el histogram_demo simple fue eliminado de la página de la galería de ejemplos de matplotlib.

Aquí hay una solución, que no requiere numpy para ser importado. Solo importo numpy para generar los datos x que se trazarán. Se basa en la función hist lugar de la bar funciones como en la answer de @unutbu.

import numpy as np mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) import matplotlib.pyplot as plt plt.hist(x, bins=50) plt.savefig(''hist.png'')

Consulte también la galería de matplotlib y los ejemplos de matplotlib .


Si estás dispuesto a usar pandas :

pandas.DataFrame({''x'':hist[1][1:],''y'':hist[0]}).plot(x=''x'',kind=''bar'')


Si no quieres barras, puedes trazarlo así:

import numpy as np import matplotlib.pyplot as plt mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) bins, edges = np.histogram(x, 50, normed=1) left,right = edges[:-1],edges[1:] X = np.array([left,right]).T.flatten() Y = np.array([bins,bins]).T.flatten() plt.plot(X,Y) plt.show()


import matplotlib.pyplot as plt import numpy as np mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) hist, bins = np.histogram(x, bins=50) width = 0.7 * (bins[1] - bins[0]) center = (bins[:-1] + bins[1:]) / 2 plt.bar(center, hist, align=''center'', width=width) plt.show()

La interfaz orientada a objetos también es sencilla:

fig, ax = plt.subplots() ax.bar(center, hist, align=''center'', width=width) fig.savefig("1.png")

Si está utilizando contenedores personalizados (no constantes), puede pasar los anchos de cálculo usando np.diff , pasar los anchos a ax.bar y usar ax.set_xticks para etiquetar los bordes del contenedor:

import matplotlib.pyplot as plt import numpy as np mu, sigma = 100, 15 x = mu + sigma * np.random.randn(10000) bins = [0, 40, 60, 75, 90, 110, 125, 140, 160, 200] hist, bins = np.histogram(x, bins=bins) width = np.diff(bins) center = (bins[:-1] + bins[1:]) / 2 fig, ax = plt.subplots(figsize=(8,3)) ax.bar(center, hist, align=''center'', width=width) ax.set_xticks(bins) fig.savefig("/tmp/out.png") plt.show()