HOWTO · Matplotlib
Cómo añadir una etiqueta del eje y al eje y secundario en Matplotlib
Podemos añadir una etiqueta del eje y al eje y secundario en Matplotlib interactuando con el objeto de los ejes y usando directamente el método pandas.DataFrame.plot.
En esta página
Para etiquetar un eje y secundario en Matplotlib, llama a set_ylabel() en el axes secundario que devuelve Axes.twinx(). El objeto axes devuelto comparte el eje x de la gráfica y proporciona un eje y independiente en el lado opuesto. Usa etiquetas descriptivas e incluye las unidades cuando ayuden a distinguir las magnitudes.
Añadir una etiqueta al eje y secundario con twinx()
Crea el segundo objeto axes con ax.twinx(), representa en él la segunda serie y asígnale directamente su etiqueta. Este ejemplo completo define ambos colores y usa tight_layout() para dejar espacio para las etiquetas.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 5, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), color="tab:blue")
ax.set_xlabel("Time (s)")
ax.set_ylabel("sin(x)", color="tab:blue")
ax.tick_params(axis="y", labelcolor="tab:blue")
ax2 = ax.twinx()
ax2.plot(x, np.cos(x), color="tab:orange")
ax2.set_ylabel("cos(x)", color="tab:orange")
ax2.tick_params(axis="y", labelcolor="tab:orange")
fig.tight_layout()
plt.show()
ax2 es el axes secundario, por lo que ax2.set_ylabel(...) coloca la etiqueta en el eje y de la derecha. Si aplicas set_ylabel() a ax, cambias en su lugar la etiqueta principal, situada a la izquierda. Igualar los colores de las etiquetas y las marcas a los de cada línea es opcional, pero puede ayudar a distinguir las dos escalas.
Al mostrar el primer ejemplo, el eje horizontal lleva la etiqueta Time (s). Una curva sinusoidal azul usa el eje y izquierdo y una curva cosenoidal naranja usa el eje y derecho. Ambas curvas abarcan los mismos valores de tiempo, pero cada escala vertical se lee en su propio lado de la figura. La imagen destacada del artículo muestra ejes de Height y Weight; es una ilustración independiente y no representa estas curvas sinusoidal y cosenoidal.
Personalizar las etiquetas del eje y para que sean claras
Elige un texto que indique la magnitud medida y su unidad, como Temperature (°C) o Pressure (kPa). El estilo es opcional: pasa argumentos como color, fontsize o fontweight a set_ylabel() si mejoran la legibilidad. Mantén las etiquetas diferenciadas y no dependas solo del color para indicar qué datos corresponden a cada escala.
El siguiente ejemplo aplica esas opciones de estilo a una gráfica cuya escala izquierda muestra la temperatura en grados Celsius y cuya escala derecha muestra la presión en kilopascales:
import matplotlib.pyplot as plt
import numpy as np
hours = np.arange(0, 24, 2)
temperature = 18 + 4 * np.sin((hours - 9) * np.pi / 12)
pressure = 101.3 + 0.8 * np.cos((hours - 6) * np.pi / 12)
fig, ax = plt.subplots()
ax.plot(hours, temperature, color="tab:red", marker="o")
ax.set_xlabel("Hour of day")
ax.set_ylabel(
"Temperature (°C)", color="tab:red", fontsize=12, fontweight="bold"
)
ax.tick_params(axis="y", labelcolor="tab:red")
ax2 = ax.twinx()
ax2.plot(hours, pressure, color="tab:green", marker="s")
ax2.set_ylabel(
"Pressure (kPa)", color="tab:green", fontsize=12, fontweight="bold"
)
ax2.tick_params(axis="y", labelcolor="tab:green")
fig.tight_layout()
plt.show()
Usa cada etiqueta como una breve descripción de los valores que se leen en ese lado de la gráfica, como en el ejemplo anterior. El texto y las unidades explican el significado de los números; igualar el color de una etiqueta al de una línea es una señal visual adicional. Si las etiquetas quedan muy juntas, tight_layout() puede ajustar el espaciado de la figura, aunque una etiqueta larga quizá requiera una figura más grande o un texto más breve.
Añadir una etiqueta al eje y secundario con DataFrame.plot
Para trabajar con datos de pandas, pasa los axes de la primera gráfica mediante ax al representar la segunda serie con secondary_y=True. DataFrame.plot devuelve un objeto axes en cada llamada: la primera devuelve el axes principal y la segunda, el secundario. Asigna cada etiqueta al objeto correspondiente.
import matplotlib.pyplot as plt
import pandas as pd
frame = pd.DataFrame({
"age": [10, 20, 30, 40],
"height": [120, 140, 160, 170],
"weight": [30, 45, 60, 70],
})
ax = frame.plot(x="age", y="height", color="tab:blue")
ax2 = frame.plot(
x="age", y="weight", secondary_y=True, ax=ax, color="tab:orange"
)
ax.set_ylabel("Height (cm)")
ax2.set_ylabel("Weight (kg)")
plt.tight_layout()
plt.show()
Aquí, secondary_y selecciona la escala de la derecha para Weight, mientras que ax=ax superpone esa serie en la misma figura. Si usas otros nombres de columna o unidades, actualiza tanto los argumentos y como las etiquetas para que describan los datos representados.
Con los valores de este ejemplo, la gráfica mostrada tiene la edad en el eje horizontal, Height (cm) a la izquierda y Weight (kg) a la derecha. La línea azul de altura sube a lo largo de las cuatro edades, y la línea naranja de peso también; cada línea se interpreta con su respectiva etiqueta y escala del eje y. Las etiquetas deben corresponder a las columnas representadas: cámbialas si modificas las columnas seleccionadas o las unidades. Pasar el ax existente mantiene ambas series en una sola figura, mientras que secondary_y=True asigna la segunda serie a su escala del lado derecho.