normed - python histograma plot
¿Cómo funciona numpy.histogram()? (3)
Mientras leía numpy, encontré la función numpy.histogram()
.
¿Para qué sirve y cómo funciona? En los documentos, mencionan contenedores : ¿qué son?
Algunos google me llevaron a la definición de Histogramas en general . Lo entiendo. Pero desafortunadamente no puedo vincular este conocimiento con los ejemplos que figuran en los documentos.
Otra cosa útil que hacer con numpy.histogram
es trazar el resultado como las coordenadas xey en un linegraph. Por ejemplo:
arr = np.random.randint(1, 51, 500)
y, x = np.histogram(arr, bins=np.arange(51))
fig, ax = plt.subplots()
ax.plot(x[:-1], y)
fig.show()
Esta puede ser una forma útil de visualizar histogramas en los que desearía un nivel más alto de granularidad sin barras en todas partes. Muy útil en histogramas de imágenes para identificar valores extremos de píxeles.
Un bin es el rango que representa el ancho de una sola barra del histograma a lo largo del eje X. También puedes llamar a esto el intervalo. (Wikipedia los define más formalmente como "categorías disjuntas").
La función del histogram
Numpy no dibuja el histograma, sino que calcula las ocurrencias de los datos de entrada que caen dentro de cada contenedor, que a su vez determina el área (no necesariamente la altura si los contenedores no son del mismo ancho) de cada barra.
En este ejemplo:
np.histogram([1, 2, 1], bins=[0, 1, 2, 3])
Hay 3 contenedores, para valores que van de 0 a 1 (excl 1.), 1 a 2 (excl. 2) y 2 a 3 (incluido 3), respectivamente. La forma en que Numpy define estos contenedores si se da una lista de delimitadores ( [0, 1, 2, 3]
) en este ejemplo, aunque también devuelve los contenedores, ya que puede elegirlos automáticamente de la entrada, si ninguno están especificados Si bins=5
, por ejemplo, usará 5 bins de ancho igual de spread entre el valor mínimo de entrada y el máximo valor de entrada.
Los valores de entrada son 1, 2 y 1. Por lo tanto, el bin "1 a 2" contiene dos ocurrencias (los dos valores de 1
), y el bin "de 2 a 3" contiene una ocurrencia (el 2
). Estos resultados están en el primer elemento en la tupla devuelta: array([0, 2, 1])
.
Dado que los contenedores aquí tienen el mismo ancho, puede usar el número de veces que ocurra para la altura de cada barra. Cuando se dibuja, tendrías:
- una barra de altura 0 para rango / bin [0,1] en el eje X,
- una barra de altura 2 para range / bin [1,2],
- una barra de altura 1 para rango / bin [2,3].
Puede trazar esto directamente con Matplotlib (su función hist
también devuelve los contenedores y los valores):
>>> import matplotlib.pyplot as plt
>>> plt.hist([1, 2, 1], bins=[0, 1, 2, 3])
(array([0, 2, 1]), array([0, 1, 2, 3]), <a list of 3 Patch objects>)
>>> plt.show()
import numpy as np
hist, bin_edges = np.histogram([1, 1, 2, 2, 2, 2, 3], bins = range(5))
A continuación, hist
indica que hay 0 elementos en el bin # 0, 2 en bin # 1, 4 en bin # 3, 1 en bin # 4.
print(hist)
# array([0, 2, 4, 1])
bin_edges
indica que bin # 0 es el intervalo [0,1), bin # 1 es [1,2), ..., bin # 3 es [3,4].
print (bin_edges)
# array([0, 1, 2, 3, 4]))
Juega con el código anterior, cambia la entrada a np.histogram
y mira cómo funciona.
Pero una imagen vale más que mil palabras:
import matplotlib.pyplot as plt
plt.bar(bin_edges[:-1], hist, width = 1)
plt.xlim(min(bin_edges), max(bin_edges))
plt.show()