Creo que hay muchas preguntas sobre el trazado de gráficos múltiples, pero no específicamente para este caso, como se muestra a continuación.
La documentación de pandas dice "repetir el método de trazado" para trazar varios grupos de columnas en un solo eje. Sin embargo, ¿cómo funcionaría esto para 3 o más grupos de columnas? Por ejemplo si definimos una tercera columna:
bx = df.plot(kind='scatter', x='a',y='f',color = 'Green',label ='f')
¿A dónde se pasaría este bx?
Además, si la trama es la misma gráfica, ¿no debería ser consistentemente 'a' o 'c' el eje x? pero la documentación tiene 2 ejes x diferentes: 'a' y 'c'
¿A dónde se pasaría este bx?
Debe repetir la segunda llamada a plot
, no la primera, por lo que no es necesario bx
.
En detalle: la plot
toma un argumento ax
opcional. Estos son los ejes en los que se dibuja. Si no se proporciona el argumento, la función crea una nueva gráfica y ejes. Además, la función devuelve los ejes para que se puedan reutilizar para otras operaciones de dibujo. La idea es no pasar un argumento ax
a la primera llamada para plot
y usar los ejes devueltos en todas las llamadas posteriores.
Puede verificar que cada llamada a plot devuelve los mismos ejes que pasó:
import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(100, 6), columns=['a', 'b', 'c', 'd', 'e', 'f']) ax1 = df.plot(kind='scatter', x='a', y='b', color='r') ax2 = df.plot(kind='scatter', x='c', y='d', color='g', ax=ax1) ax3 = df.plot(kind='scatter', x='e', y='f', color='b', ax=ax1) print(ax1 == ax2 == ax3) # True
Además, si el diagrama es el mismo gráfico, ¿no debería ser consistentemente 'a' o 'c' el eje x?
No necesariamente. Si tiene sentido colocar diferentes columnas en los mismos ejes, depende de los datos que representen. Por ejemplo, si a
son los ingresos y c
son los gastos, tendría sentido colocar ambos en el mismo eje de "dinero". Por el contrario, si a
fuera el número de guisantes y c
fuera el voltaje, probablemente no deberían estar en el mismo eje.
Puede trazar cualquier columna contra cualquier columna que desee. Si eso tiene sentido, tienes que decidir por ti mismo. Por ejemplo, trazar una columna que indica el tiempo en el mismo eje que una columna que indica la distancia puede no tener sentido, pero trazar dos columnas que contienen distancia en el mismo eje está bien.
Para especificar que un gráfico certin debe estar en ejes ya existentes ( ax
), debe especificar la palabra clave ax
como se ve en la documentación. Por supuesto, puede crear varias parcelas en los mismos ejes.
ax = df.plot(kind="scatter", x="x",y="a", color="b", label="a vs. x") df.plot(x="x",y="b", color="r", label="b vs. x", ax=ax) df.plot( x="x",y="c", color="g", label="c vs. x", ax=ax)
Un ejemplo completo:
import pandas as pd import matplotlib.pyplot as plt import numpy as np x = np.linspace(0,6.3, 50) a = (np.sin(x)+1)*3 b = (np.cos(x)+1)*3 c = np.ones_like(x)*3 d = np.exp(x)/100. df = pd.DataFrame({"x":x, "a":a, "b":b, "c":c, "d":d}) ax = df.plot(kind="scatter", x="x",y="a", color="b", label="a vs. x") df.plot(x="x",y="b", color="r", label="b vs. x", ax=ax) df.plot( x="x",y="c", color="g", label="c vs. x", ax=ax) df.plot( x="d",y="x", color="orange", label="b vs. d", ax=ax) df.plot( x="a",y="x", color="purple", label="x vs. a", ax=ax) ax.set_xlabel("horizontal label") ax.set_ylabel("vertical label") plt.show()
Dentro del ecosistema holoviz , hay una biblioteca llamada hvplot
que proporciona una muy buena funcionalidad de trazado de alto nivel (además de holoviews
) que funciona de manera inmediata con Pandas:
import numpy as np import hvplot.pandas import pandas as pd df = pd.DataFrame(np.random.randn(100, 6), columns=['a', 'b', 'c', 'd', 'e', 'f']) df.hvplot(x='a', y=['b', 'c', 'd', 'e'], kind='scatter')