Cómo crear gráficos con un eje secundario en matplotlib

Publicado el 16 septiembre 2024 por Daniel Rodríguez @analyticslane

Cuando se necesita comprar series de datos con escalas o unidades diferentes una de las mejores opciones son los gráficos con ejes secundarios. Mostrando los valores de una serie en el eje de la derecha y otra en la de la izquierda. Así, la persona que analiza el gráfico puede comparar las tendencias de ambas series sin los problemas de las dimensiones o escalas. En esta entrada, se explicará cómo se pueden crear gráficos con un eje secundario en matplotlib y personalizar el resultado.

Importar las bibliotecas necesarias

Como es habitual, antes de poder hacer nada es necesario importar las bibliotecas necesarias. En esta ocasión se va a usar, además de matplotlib, numpy para procesar los datos.

import matplotlib.pyplot as plt
import numpy as np

Crear el gráfico básico

En primer lugar, se puede comenzar con la creación de un gráfico básico solamente con una serie de datos. Antes de lo cual, se debe crear un conjunto de datos de ejemplo que represente la producción mensual de energía solar y eólica durante un año. En el siguiente código se crea una figura en la que se crean los datos y una gráfica con la serie de energía solar.

# Datos de ejemplo
meses = np.arange(1, 13) # Meses del año
energia_solar = np.array([30, 45, 50, 60, 70, 80, 90, 85, 75, 65, 50, 40]) # Energía solar en GWh
energia_eolica = np.array([100, 95, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40]) # Energía eólica en GWh

# Crear la figura y el eje principal
fig, ax1 = plt.subplots()

# Graficar la energía solar
ax1.plot(meses, energia_solar, 'g-', marker='o')
ax1.set_xlabel('Meses')
ax1.set_ylabel('Energía Solar (GWh)', color='g')
ax1.tick_params(axis='y', labelcolor='g')

# Mostrar el gráfico
plt.show()

En este ejemplo, meses representa los meses del año, energia_solar es la energía producida por energía solar, y energia_eolica por energía eólica. Una vez definidos los datos, se crea un gráfico de línea para la energía solar en el eje izquierdo y fijando el color de la líneas y etiquetas en verde.

Agregar un eje secundario

Una vez creado el gráfico básico, para mostrar la producción de energía eólica, se agrega un eje secundario utilizando el método twinx(). El ejemplo se muestra en el siguiente código.

# Crear la figura y el eje principal
fig, ax1 = plt.subplots()

# Graficar la energía solar
ax1.plot(meses, energia_solar, 'g-', marker='o')
ax1.set_xlabel('Meses')
ax1.set_ylabel('Energía Solar (GWh)', color='g')
ax1.tick_params(axis='y', labelcolor='g')

# Crear un segundo eje que comparte el eje x con el primero
ax2 = ax1.twinx()

# Graficar la energía eólica
ax2.plot(meses, energia_eolica, 'b-', marker='s')
ax2.set_ylabel('Energía Eólica (GWh)', color='b')
ax2.tick_params(axis='y', labelcolor='b')

# Mostrar el gráfico
plt.show()

En este ejemplo, el método twinx() permite crear un segundo eje que comparte el mismo eje x, pero con un eje y independiente. Lo que permite representar datos con diferentes escalas o unidades, como en este caso.

Personalizar colores y etiquetas

En cualquier gráfico es importante, y más en los que tienen varias series, que los gráficos sean fácilmente distinguibles y que las etiquetas sean claras. Para lo que se puede añadir etiquetas para mejorar la legibilidad.

# Crear la figura y el eje principal
fig, ax1 = plt.subplots()

# Graficar la energía solar
ax1.plot(meses, energia_solar, 'g-', marker='o', label='Energía Solar')
ax1.set_xlabel('Meses')
ax1.set_ylabel('Energía Solar (GWh)', color='g')
ax1.tick_params(axis='y', labelcolor='g')

# Crear un segundo eje que comparte el eje x con el primero
ax2 = ax1.twinx()

# Graficar la energía eólica
ax2.plot(meses, energia_eolica, 'b-', marker='s', label='Energía Eólica')
ax2.set_ylabel('Energía Eólica (GWh)', color='b')
ax2.tick_params(axis='y', labelcolor='b')

# Añadir leyenda para ambas líneas
fig.legend(loc='upper left', bbox_to_anchor=(0.32, 0.28))

# Mostrar el gráfico
plt.show()

En este ejemplo, se ha agregado una leyenda a cada una de las series que ayuda a identificar cada línea. Lo que facilita la lectura de los gráficos.

Ajustes finales

Finalmente, se pueden hacer ajustes finales como son los títulos y asegurar que los datos se representen con claridad.

# Crear la figura y el eje principal
fig, ax1 = plt.subplots()

# Graficar la energía solar
ax1.plot(meses, energia_solar, 'g-', marker='o', label='Energía Solar')
ax1.set_xlabel('Meses')
ax1.set_ylabel('Energía Solar (GWh)', color='g')
ax1.tick_params(axis='y', labelcolor='g')

# Crear un segundo eje que comparte el eje x con el primero
ax2 = ax1.twinx()

# Graficar la energía eólica
ax2.plot(meses, energia_eolica, 'b-', marker='s', label='Energía Eólica')
ax2.set_ylabel('Energía Eólica (GWh)', color='b')
ax2.tick_params(axis='y', labelcolor='b')

# Añadir leyenda para ambas líneas
fig.legend(loc='upper left', bbox_to_anchor=(0.32, 0.28))

# Título del gráfico
plt.title('Producción de Energía Solar y Eólica durante el Año')

# Ajustar el diseño para que no haya solapamientos
fig.tight_layout()

# Mostrar el gráfico
plt.show()

En este ejemplo final, se ha añadido un título descriptivo y llamado al método tight_layout() para evitar que las etiquetas se solapen, mejorando así el resultado final.

Conclusiones

Los gráficos con ejes secundarios en matplotlib son una excelente opción para visualizar datos que cuentan con diferentes escalas o unidades. En esta entrada, se ha visto cómo crear un gráfico básico, añadir un eje secundario, personalizar colores y etiquetas, y realizar ajustes finales para obtener una mejor representación de los datos.