Hist in matplotlib: los bins no están centrados y las proporciones no son correctas en el eje

Echale un vistazo a éste ejemplo:

import matplotlib.pyplot as plt l = [3,3,3,2,1,4,4,5,5,5,5,5,5,5,5,5] plt.hist(l,normed=True) plt.show() 

La salida se publica como una imagen. Tengo dos preguntas:

a) ¿Por qué solo los 4 y 5 contenedores están centrados alrededor de su valor? ¿No deberían los otros ser eso también? ¿Hay algún truco para centrarlos?

b) ¿Por qué los contenedores no están normalizados a la proporción? Quiero que los valores de y de todos los contenedores sumen uno.

Tenga en cuenta que mi ejemplo real contiene muchos más valores en la lista, pero todos son discretos.

introduzca la descripción de la imagen aquí

Debe ajustar los argumentos de palabras clave de la función plt.hist . Hay muchos de ellos y la documentación puede ayudarlo a responder muchas de estas preguntas.

a. ) Puede pasar las palabras clave bins=range(1,7) y align=left . Al establecer la palabra clave bins en una secuencia, se muestran los bordes de cada bin. Por ejemplo, [1,2], [2,3], [3,4], ..., [5, 6] .

segundo. ) Verifique los anchos de sus contenedores ( rwidth!=1 ). De la documentación matplotlib.pyplot.hist :

Si es Verdadero, el primer elemento de la tupla de retorno serán los conteos normalizados para formar una densidad de probabilidad, es decir, n / (len (x) * dbin). En una densidad de probabilidad, la integral del histogtwig debe ser 1; puede verificar que con una integración trapezoidal de la función de densidad de probabilidad:

Esto significa que el área que se encuentra debajo de sus contenedores es la sum de uno, pero como los anchos de los contenedores son menores que 1, las alturas se normalizan de tal manera que las alturas no sumn 1. Si ajusta rwidth=1 , obtienes una buena plot:

 plt.hist(l, bins=range(1,7), align='left', rwidth=1, normed=True)