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