matriz - libreria matplotlib python
Trazar un histograma a partir de datos precontados en Matplotlib (4)
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 Histograma con una lista separada que indica la frecuencia
Me gustaría usar Matplotlib para trazar un histograma 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 histograma.
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 histograma que me permite controlar los anchos de los contenedores, el rango de la parcela, 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 histograma 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, ¿hay un método conveniente para "enrollar" mis conteos por artículo en conteos en contenedores?
También puede utilizar el mar para trazar el histograma:
import matplotlib.pyplot as plt
import seaborn as sns
sns.distplot(list(counted_data.keys()), hist_kws={"weights":list(counted_data.values())})
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 histograma:
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)
pyplot.hist la opción de weights
pyplot.hist para ponderar cada clave por su valor, produciendo el histograma 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.