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 calcular los anchos usando np.diff, pasar los anchos ax.bary usar ax.set_xtickspara 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()

plt.barElwidthparámetro de @CMCDragonkai: puede aceptar un objeto similar a una matriz (en lugar de un escalar). Entonces podría usar enwidth = np.diff(bins)lugar dewidth = 0.7 * (bins[1] - bins[0]).widthconfiguración por sí sola solo establece el ancho de la barra, ¿verdad? Estoy hablando de las etiquetas del eje x (es decir, quiero ver que los bordes del contenedor reales son etiquetas en el eje x). Debería ser similar a cómoplt.histfunciona.ax.set_xtickspara configurar las etiquetas x. Agregué un ejemplo arriba para mostrar lo que quiero decir.Si no quiere barras, puede trazarlo así:
fuente
ax.step.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 simple
histogram_demose eliminó de la página de la galería de ejemplos de matplotlib.Aquí hay una solución, que no requiere
numpyser importada. Solo importo numpy para generar los datosxque se trazarán. Se basa en la función enhistlugar de la funciónbarcomo en la respuesta de @unutbu.Consulte también la galería de matplotlib y los ejemplos de matplotlib .
fuente
Si está dispuesto a usar
pandas:fuente
pandas, probablemente debería incluir un enlace a su sitio y un ejemplo más detallado que explique lo que está sucediendo.Creo que esto podría ser útil para alguien.
La función de histograma de Numpy, para mi disgusto (aunque aprecio que hay una buena razón para ello), devuelve los bordes de cada contenedor, en lugar del valor del contenedor. 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 recuentos / densidad.
Para solucionar esto, utilicé np.digitize para cuantificar la entrada y devolver un número discreto de bins, junto con una fracción de recuentos para cada bin. Puede editar fácilmente para obtener el número entero de recuentos.
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
fuente