Trazar un histogtwig a partir de datos precontados en Matplotlib

Me gustaría usar Matplotlib para trazar un histogtwig sobre los datos que se han contado previamente. Por ejemplo, digamos que tengo los datos en bruto.

data = [1, 2, 2, 3, 4, 5, 5, 5, 5, 6, 10] 

Dados estos datos, puedo usar

 pylab.hist(data, bins=[...]) 

para trazar un histogtwig.

En mi caso, los datos se han contabilizado previamente y se representan como un diccionario:

 counted_data = {1: 1, 2: 2, 3: 1, 4: 1, 5: 4, 6: 1, 10: 1} 

Idealmente, me gustaría pasar estos datos pre-contados a una función de histogtwig que me permita controlar los anchos de los contenedores, el rango de la plot, etc., como si hubiera pasado los datos en bruto. Como solución alternativa, estoy expandiendo mis conteos a los datos en bruto:

 data = list(chain.from_iterable(repeat(value, count) for (value, count) in counted_data.iteritems())) 

Esto es ineficiente cuando counted_data contiene recuentos para millones de puntos de datos.

¿Existe una forma más fácil de usar Matplotlib para producir un histogtwig a partir de mis datos precontados?

De manera alternativa, si es más fácil simplemente los datos de trazado de barras que han sido pre-binados, ¿existe un método conveniente para “enrollar” mis conteos por artículo en conteos en contenedores?

Puede usar el argumento de la palabra clave de weights para np.histgram (que plt.hist llama debajo)

 val, weight = zip(*[(k, v) for k,v in counted_data.items()]) plt.hist(val, weights=weight) 

Suponiendo que solo tenga enteros como teclas, también puede usar la bar directamente:

 min_bin = np.min(counted_data.keys()) max_bin = np.max(counted_data.keys()) bins = np.arange(min_bin, max_bin + 1) vals = np.zeros(max_bin - min_bin + 1) for k,v in counted_data.items(): vals[k - min_bin] = v plt.bar(bins, vals, ...) 

donde … es lo que alguna vez los argumentos que desea pasar a la bar (doc)

Si desea volver a agrupar sus datos, consulte el Histogtwig con una lista separada que indica la frecuencia

Usé la opción de weights pyplot.hist para ponderar cada clave por su valor, produciendo el histogtwig que quería:

pylab.hist(counted_data.keys(), weights=counted_data.values(), bins=range(50))

Esto me permite confiar en el hist para volver a agrupar mis datos.

la longitud de la matriz de “bandejas” debe ser más larga que la longitud de “cuentas”. Aquí está la manera de reconstruir completamente el histogtwig:

 import numpy as np import matplotlib.pyplot as plt bins = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]).astype(float) counts = np.array([5, 3, 4, 5, 6, 1, 3, 7]).astype(float) centroids = (bins[1:] + bins[:-1]) / 2 counts_, bins_, _ = plt.hist(centroids, bins=len(counts), weights=counts, range=(min(bins), max(bins))) plt.show() assert np.allclose(bins_, bins) assert np.allclose(counts_, counts) 

También puede utilizar el mar para trazar el histogtwig:

 import matplotlib.pyplot as plt import seaborn as sns sns.distplot(list(counted_data.keys()), hist_kws={"weights":list(counted_data.values())})