2012-02-04 3 views

Respuesta

121

Un contenedor es el rango que representa el ancho de una 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 Numpy histogram no dibuja el histograma, pero calcula las ocurrencias de datos de entrada que caen dentro de cada contenedor, lo que a su vez determina el área (no necesariamente la altura si los contenedores no tienen el mismo ancho) de cada barra.

En este ejemplo:

np.histogram([1, 2, 1], bins=[0, 1, 2, 3]) 

Hay 3 compartimentos, para valores que van de 0 a 1 (excl 1.), de 1 a 2 (excl. 2) y 2 a 3 (. Incl 3) , respectivamente. La forma en que Numpy define estos contenedores si 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 no se especifica ninguno. Si bins=5, por ejemplo, usará 5 intervalos de ancho igual distribuidos entre el valor mínimo de entrada y el valor máximo de entrada.

Los valores de entrada son 1, 2 y 1. Por lo tanto, bin "1 a 2" contiene dos apariciones (los dos valores 1) y bin "2 a 3" contiene una ocurrencia (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 aparezca la altura de cada barra. Cuando se retira, que tendría:

  • una barra de altura 0 para la gama/bin [0,1] en el eje X,
  • una barra de altura 2 para la gama/bin [1,2] ,
  • una barra de altura 1 para rango/bin [2,3].

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

enter image description here

+4

Puede que también le interese [esta respuesta] (http://stackoverflow.com/a/5328669/372643) si desea trazarlas. [Matplotlib también puede calcularlos directamente] (http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.hist). Vea ejemplos [aquí] (http://matplotlib.sourceforge.net/examples/api/histogram_demo.html) y [aquí] (http://matplotlib.sourceforge.net/examples/pylab_examples/histogram_demo_extended.html). – Bruno

+0

Gracias por esta respuesta, ¡simplemente me ahorró una gran cantidad de problemas! – AlexFZ

50
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 son 0 artículos en el cubo # 0, 2 en el cubo # 1, 4 en el cubo # 3, 1 en el cubo # 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])) 

jugar con el código anterior, cambie la entrada a np.histogram y ver 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() 

enter image description here

+3

Creo que esto sería más preciso: 'plt.bar (bin_edges [: - 1], hist, width = 1)' y 'plt.xlim (min (bin_edges), max (bin_edges))', para hacer que las barras ajuste su ancho esperado (de lo contrario, puede haber un contenedor más pequeño sin valores intermedios). – Bruno

+0

Bruno, gracias. Eso ciertamente es mejor. – unutbu

0

Otra cosa útil que ver con numpy.histogram es trazar la salida como la coordenadas X e Y 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() 

enter image description here

Esta puede ser una forma útil de visualizar histogramas en la que desea un mayor nivel de granularidad sin barras en todas partes. Muy útil en histogramas de imágenes para identificar valores extremos de píxeles.