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.

Las barras apiladas están inesperadamente anotadas con la suma de las alturas de las barras.

Mis datos:

names_col = ['Count','Freq']
dat = [['Matching', 56935],['Mismatching', 100587]]
plot_df = pd.DataFrame(data=dat,columns=names_col)

Estoy intentando hacer un gráfico de barras apiladas que muestre los valores, aquí está mi código:

plt.figure(figsize=(16,9))
p=plot_df.set_index('Count').T.plot(kind='bar', stacked=True)
p.bar_label(p.containers[0])
p.bar_label(p.containers[1])
plt.show();

En primer lugar, la figura no tiene el tamaño (16,9), ¿qué está mal?
Y en el segundo gráfico muestra los valores como:

gráfico

en lugar de los valores para matching – 56935 (aquí está bien), y mismatching – 100587, el gráfico muestra el total (157522).
¿Cómo puedo acceder y mostrar también el valor para Mismatching?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece haber dos problemas con el código proporcionado.

    En primer lugar, el tamaño de la figura de salida puede no ser (16,9) porque es posible que el parámetro figsize en plt.figure(figsize=(16,9)) no sea compatible con el backend que se está utilizando. Esto se puede confirmar intentando cambiar el tamaño a un valor diferente y verificando si se refleja en la salida. Si el tamaño de salida no cambia, entonces es probable que el problema esté en el backend.

    En segundo lugar, la gráfica muestra el total de los valores tanto de Matching como de Mismatching en lugar del valor específico de Mismatching. Esto se debe a que el pd.DataFrame se creó con names_col como los nombres de las columnas, pero el método set_index en plot_df.set_index('Count') intenta establecer el índice como la columna Count, la cual no existe. Entonces, set_index en realidad crea una nueva columna con el nombre Count y utiliza el índice existente como etiquetas de fila. Esto hace que la gráfica muestre la suma de los valores tanto de Matching como de Mismatching en lugar de solo el valor de Mismatching.

    Para solucionar esto, puedes eliminar el método set_index y cambiar el código de la gráfica a p=plot_df.plot(x='Count', kind='bar', stacked=True) o agregar una nueva columna con el valor Mismatching y utilizar esa columna como índice para set_index. Por ejemplo:

    names_col = ['Category', 'Count']
    dat = [['Matching', 56935], ['Mismatching', 100587]]
    plot_df = pd.DataFrame(data=dat, columns=names_col)
    plot_df['Value'] = plot_df['Count']  # agregar nueva columna con los valores de Count
    plot_df = plot_df.set_index('Category')  # establecer índice en Category
    
    plt.figure(figsize=(16,9))
    p = plot_df.T.plot(kind='bar', stacked=True)
    p.bar_label(p.containers[0])
    p.bar_label(p.containers[1])
    plt.show()
    

    Esto debería crear la gráfica de barras apiladas con los valores de Matching y Mismatching mostrados.

Comments are closed.