es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

matplotlib hist() falla (la suma de las barras no es igual a uno) con Density=True y pesos.

Estoy teniendo problemas al trabajar con plt.hist(density=True) aunque he configurado weights. Mi objetivo es obtener un histograma en el que la suma de las barras (eje y) sea igual a 1. Es un tema ampliamente discutido, sin embargo [1][2] no puedo encontrar la solución correcta. Aquí está mi código:

data = np.array(data).astype("float32")

weights = np.ones_like(data)/float(len(data))

n, bins, patches = plt.hist(x=data, density=True, bins=20, color='#0504aa',weights=weights,
                            alpha=0.7, rwidth=0.85)

lo cual crea:
enter image description here
Las barras obviamente no suman uno. ¿Alguien tiene una solución para mi problema? Tal vez ya esté publicada en otra parte, ¡pero no puedo encontrarla!
Saludos.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Cuando se trabaja con plt.hist(density=True) en matplotlib, establecer weights por sí solo no hará que las barras sumen uno.

    Una solución es calcular manualmente la suma de las barras y volver a escalarlas en consecuencia. Aquí hay un ejemplo de código:

    data = np.array(data).astype("float32")
    
    weights = np.ones_like(data)/float(len(data))
    
    n, bins, patches = plt.hist(x=data, density=True, bins=20, color='#0504aa',
                                weights=weights, alpha=0.7, rwidth=0.85)
    
    # Calcular la suma de las barras
    total = sum(n)
    
    # Rescala las barras
    for i in range(len(patches)):
        patches[i].set_height(patches[i].get_height()/total)
    
    # Establecer el límite del eje y a 1 
    plt.ylim(top=1)
    

    Este código vuelve a escalar las alturas de las barras en función de la suma total y luego establece el límite del eje y a 1 para asegurarse de que las barras sumen uno.

    ¡Espero que esto ayude!

Comments are closed.