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:
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!
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.
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.
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.0
dónde C=0.964883
cubiertas, A=0.914509
y B=0.372662
. Es probable que los datos trazados de esta manera se malinterpreten.
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.
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 aly=
parámetro, como se muestra en la respuesta aceptada.–Trenton McKinney
el dia de ayer