Histogtwig matplotlib

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

bins, n=hist() 

Pero no le gustó eso. ¿Alguna recomendación?

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

introduzca la descripción de la imagen aquí

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 bandejas personalizadas (no constantes), puede pasar el cálculo de los anchos utilizando np.diff , pasar los anchos a ax.bar y usar ax.set_xticks para etiquetar los bordes de la bandeja:

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

introduzca la descripción de la imagen aquí

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

histograma

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

Aquí hay una solución, que no requiere numpy . Solo importo numpy para generar los datos x a trazar. Depende de la función hist lugar de la bar funciones como en la respuesta 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') 

introduzca la descripción de la imagen aquí

También puedes ver 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') 

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

La función de histogtwig de Numpy, para mi molestia (aunque, aprecio que hay una buena razón para ello), devuelve los bordes de cada bandeja, en lugar del valor de la bandeja. Si bien, 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), esta no es la salida deseada 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 conteos / densidad.

Para solucionar esto, utilicé np.digitize para cuantificar la entrada, y devolví un número discreto de contenedores, junto con una fracción de conteos para cada contenedor. Podrías editar fácilmente para obtener el número entero de cuentas.

 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