python - pyplot - pandas histogram
Histograma Matplotlib (5)
Creo que esto podría ser útil para alguien.
La función de histograma de Numpy, para mi molestia (aunque, aprecio que haya una buena razón para ello), devuelve los bordes de cada contenedor, en lugar del valor del contenedor. Mientras que 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), este no es el resultado deseado 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 evitar esto, utilicé np.digitize para cuantizar la entrada, y devolver un número discreto de contenedores, junto con la fracción de conteos para cada contenedor. Puede editar fácilmente para obtener el número entero de conteos.
def compute_PMF(data)
import numpy as np
from collections import Counter
_, bins = np.histogram(data, bins=''auto'', range=(data.min(), data.max()), density=False)
h = Counter(np.digitize(data,bins) - 1)
weights = np.asarray(list(h.values()))
weights = weights / weights.sum()
values = np.asarray(list(h.keys()))
return weights, values
####
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
Entonces tengo un pequeño problema. Tengo un conjunto de datos en scipy que ya está en formato de histograma, así que tengo el centro de los contenedores y el número de eventos por contenedor. ¿Cómo puedo ahora trazar es como un histograma? Intenté simplemente hacer
bins, n=hist()
pero no me gustó eso. ¿Alguna recomendación?
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 histogram_demo
simple fue eliminado de la página de la galería de ejemplos de matplotlib.
Aquí hay una solución, que no requiere numpy
para ser importado. Solo importo numpy para generar los datos x
que se trazarán. Se basa en la función hist
lugar de la bar
funciones como en la answer de @unutbu.
import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
import matplotlib.pyplot as plt
plt.hist(x, bins=50)
plt.savefig(''hist.png'')
Consulte también la galería de matplotlib y los ejemplos de matplotlib .
Si estás dispuesto a usar pandas
:
pandas.DataFrame({''x'':hist[1][1:],''y'':hist[0]}).plot(x=''x'',kind=''bar'')
Si no quieres barras, puedes trazarlo así:
import numpy as np
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
bins, edges = np.histogram(x, 50, normed=1)
left,right = edges[:-1],edges[1:]
X = np.array([left,right]).T.flatten()
Y = np.array([bins,bins]).T.flatten()
plt.plot(X,Y)
plt.show()
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 los anchos de cálculo usando np.diff
, pasar los anchos a 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()