Trace varias columnas de pandas DataFrame en el gráfico de barras

3 minutos de lectura

Avatar de usuario de Edamame
edamame

Estoy usando el siguiente código para trazar un gráfico de barras:

import matplotlib.pyplot as pls 
my_df.plot(x='my_timestampe', y='col_A', kind='bar') 
plt.show()

La trama funciona bien. Sin embargo, quiero mejorar el gráfico al tener 3 columnas: ‘col_A’, ‘col_B’ y ‘col_C’, todas en el gráfico. Como en la figura de ejemplo a continuación:

ingrese la descripción de la imagen aquí

me gustaría el col_A se muestra en azul sobre el eje x, col_B en rojo debajo del eje x, y col_C en verde sobre el eje x. ¿Es esto algo posible en matplotlib? ¿Cómo hago cambios para trazar las tres columnas? ¡Gracias!

Avatar de usuario de ImportanceOfBeingErnest
La Importancia De SerErnest

Probado en python 3.11, pandas 1.5.1, matplotlib 3.6.2

Importaciones y datos de muestra

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(2022)  # creates a consistent sample
y = np.random.rand(10,4)
y[:,0]= np.arange(10)
df = pd.DataFrame(y, columns=["X", "A", "B", "C"])

     X         A         B         C
0  0.0  0.499058  0.113384  0.049974
1  1.0  0.486988  0.897657  0.647452
2  2.0  0.721135  0.831353  0.827568
3  3.0  0.957044  0.368044  0.494838
4  4.0  0.619429  0.977530  0.096433
5  5.0  0.292499  0.298675  0.752473
6  6.0  0.523737  0.864436  0.388843
7  7.0  0.475181  0.564672  0.349429
8  8.0  0.037820  0.794270  0.357883
9  9.0  0.914509  0.372662  0.964883

Se pueden trazar varias columnas a la vez proporcionando una lista de nombres de columna al y= parámetro en pandas.DataFrame.plot

ax = df.plot(x="X", y=["A", "B", "C"], kind="bar", rot=0)

Esto producirá un gráfico donde se agrupan las barras.

ingrese la descripción de la imagen aquí

ax = df.plot(x="X", y=["A", "B", "C"], kind="bar", rot=0, stacked=True)
_ = ax.legend(bbox_to_anchor=(1, 1.02), loc="upper left")

Esto producirá un gráfico donde se apilan las barras.

ingrese la descripción de la imagen aquí


Para que se superpongan, debe llamar .plot varias veces, y suministre las primeras hachas devueltas al ax= parámetro de las parcelas posteriores.

ax = df.plot(x="X", y="A", kind="bar", rot=0)
df.plot(x="X", y="B", kind="bar", ax=ax, color="C2", rot=0)
df.plot(x="X", y="C", kind="bar", ax=ax, color="C3", rot=0)

plt.show()

Esto producirá un gráfico donde las barras están superpuestas, lo cual no es una implementación estándar ni recomendada porque los valores más grandes graficados en un grupo posterior cubrirán valores más pequeños, como se puede ver en x=9.0dónde C=0.964883 cubiertas, A=0.914509 y B=0.372662. Es probable que los datos trazados de esta manera se malinterpreten.

ingrese la descripción de la imagen aquí

Este gráfico solo tiene sentido si los valores más altos son los de la primera columna trazada para todas las barras. Este parece ser el caso en el resultado deseado de la pregunta. De lo contrario, no recomendaría usar este tipo de gráfico y, en su lugar, usar un gráfico apilado o las barras agrupadas de la primera solución aquí. Se podría experimentar con la transparencia (alpha) y ver si la última solución da un resultado atractivo.

avatar de usuario de ayorgo
ayorgo

Aunque la respuesta aceptada funciona bien, ya que v0.21.0rc1 da una advertencia

UserWarning: Pandas no permite que se creen columnas a través de un nuevo nombre de atributo

En cambio, uno puede hacer

df[["X", "A", "B", "C"]].plot(x="X", kind="bar")

  • Según un comentario eliminado de @ImportanceOfBeingErnest, el UserWarning nunca fue reproducible, y ciertamente no es reproducible ahora. El enfoque canónico para proporcionar columnas a .plot es pasar una lista al y= parámetro, como se muestra en la respuesta aceptada.

    –Trenton McKinney

    el dia de ayer


¿Ha sido útil esta solución?