Python

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

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()
Gráfico básico con la producción de energía solar

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()
La producción de energía solar y eólica en dos ejes diferentes

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()
Gráfico en el que se ha agregado etiquetas para diferencia las series

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()
Resultado final de los gráficos con un eje secundario en matplotlib

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.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez
Tags: Matplotlib

Recent Posts

Data Lake y Data Warehouse: diferencias, usos y cómo se complementan en la era del dato

En la era del dato, las organizaciones se enfrentan al reto de gestionar volúmenes masivos…

2 días ago

Documentar tu API de Express con TypeScript usando OpenAPI (Swagger)

En la serie Creación de una API REST con Express y TypeScript construimos una API…

4 días ago

Curiosidad: El sesgo de supervivencia, o por qué prestar atención sólo a los que “llegaron” puede engañarte

Durante la Segunda Guerra Mundial, la Fuerza Aérea de Estados Unidos quería reforzar sus aviones…

1 semana ago

Cómo abrir una ventana de Chrome con tamaño y posición específicos desde la línea de comandos en Windows

En muchas situaciones —ya sea para grabar un tutorial, tomar capturas de pantalla profesionales, probar…

2 semanas ago

La Paradoja del Cumpleaños, o por qué no es tan raro compartir fecha de nacimiento

Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…

2 semanas ago

Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python)

En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…

3 semanas ago

This website uses cookies.