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.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()
plt.bar
Elwidth
pará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])
.width
configuració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.hist
funciona.ax.set_xticks
para 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_demo
se eliminó de la página de la galería de ejemplos de matplotlib.Aquí hay una solución, que no requiere
numpy
ser importada. Solo importo numpy para generar los datosx
que se trazarán. Se basa en la función enhist
lugar de la funciónbar
como 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