tiempo real matrices histograma graficos graficas graficar crear coordenadas calcular python graph numpy matplotlib scipy

real - matplotlib python



trazado de histogramas cuyas alturas de barra suman 1 en matplotlib (4)

Me gustaría trazar un histograma normalizado a partir de un vector usando matplotlib. Intenté lo siguiente:

plt.hist(myarray, normed=True)

tanto como:

plt.hist(myarray, normed=1)

pero ninguna de las opciones produce un eje y desde [0, 1] tal que las alturas de las barras del histograma sumen a 1. Me gustaría producir un histograma así: ¿cómo puedo hacerlo?

¡Gracias!


Aquí hay otra solución simple que utiliza el método np.histogram() .

myarray = np.random.random(100) results, edges = np.histogram(myarray, normed=True) binWidth = edges[1] - edges[0] plt.bar(edges[:-1], results*binWidth, binWidth)

De hecho, puede verificar que las sumas totales sean hasta 1 con:

> print sum(results*binWidth) 1.0


Sé que esta respuesta es demasiado tarde considerando que la pregunta tiene fecha de 2010, pero me encontré con esta pregunta ya que yo mismo estaba enfrentando un problema similar. Como ya se indicó en la respuesta, normed = Verdadero significa que el área total bajo el histograma es igual a 1 pero la suma de las alturas no es igual a 1. Sin embargo, quería, por conveniencia de la interpretación física de un histograma, hacer una con suma de alturas igual a 1.

Encontré una pista en la siguiente pregunta: Python: histograma con área normalizada a algo distinto de 1

Pero no pude encontrar una forma de hacer que las barras imitaran la característica histtype = "step" hist (). Esto me desvió a: Matplotlib - Histograma escalonado con datos ya agrupados

Si la comunidad lo considera aceptable, me gustaría presentar una solución que sintetice ideas de los dos puestos anteriores.

import matplotlib.pyplot as plt # Let X be the array whose histogram needs to be plotted. nx, xbins, ptchs = plt.hist(X, bins=20) plt.clf() # Get rid of this histogram since not the one we want. nx_frac = nx/float(len(nx)) # Each bin divided by total number of objects. width = xbins[1] - xbins[0] # Width of each bin. x = np.ravel(zip(xbins[:-1], xbins[:-1]+width)) y = np.ravel(zip(nx_frac,nx_frac)) plt.plot(x,y,linestyle="dashed",label="MyLabel") #... Further formatting.

Esto me ha funcionado maravillosamente, aunque en algunos casos noté que la "barra" más a la izquierda o la "barra" más a la derecha del histograma no se cierra tocando el punto más bajo del eje Y. En tal caso, agregar un elemento 0 al inicio o al final de y logra el resultado necesario.

Solo pensé en compartir mi experiencia. Gracias.


Sería más útil si presentaras un ejemplo de trabajo más completo (o en este caso no funcional).

Intenté lo siguiente:

import numpy as np import matplotlib.pyplot as plt x = np.random.randn(1000) fig = plt.figure() ax = fig.add_subplot(111) n, bins, rectangles = ax.hist(x, 50, normed=True) fig.canvas.draw() plt.show()

De hecho, esto producirá un histograma de gráfico de barras con un eje y que va desde [0,1] .

Además, según la documentación hist (es decir, ax.hist? De ipython ), creo que la suma también está bien:

*normed*: If *True*, the first element of the return tuple will be the counts normalized to form a probability density, i.e., ``n/(len(x)*dbin)``. In a probability density, the integral of the histogram should be 1; you can verify that with a trapezoidal integration of the probability density function:: pdf, bins, patches = ax.hist(...) print np.sum(pdf * np.diff(bins))

Dando esto una prueba después de los comandos anteriores:

np.sum(n * np.diff(bins))

Obtengo un valor de retorno de 1.0 como se esperaba. Recuerda que normed=True no significa que la suma del valor en cada barra sea la unidad, sino que la integral sobre las barras es la unidad. En mi caso np.sum(n) devolvió aproximadamente 7.2767 .


Si desea que la suma de todas las barras sea igual a la unidad, pondere cada casilla por el número total de valores:

weights = np.ones_like(myarray)/float(len(myarray)) plt.hist(myarray, weights=weights)

Espero que ayude, aunque el hilo es bastante viejo ...