Python

Sincronizar múltiples ejes con twinx(): Comparación de datos con diferentes escalas en un solo gráfico con Matplotlib

Al realizar un análisis de datos, a menudo necesitamos comparar la evolución de dos series de datos relacionadas entre sí, pero con escalas completamente diferentes. Por ejemplo:

  • Comparar la temperatura promedio de una región con las ventas de helados en la misma.
  • Analizar el volumen de lluvia mensual frente al crecimiento agrícola.

Un gráfico tradicional con un solo eje Y no puede mostrar correctamente ambos conjuntos de datos debido a las diferencias existentes en las escalas de los mismos. Por ejemplo, mientras la temperatura esté en decenas de grados, las ventas de helados tendrán valores de miles o millones de euros. Por eso, si intentamos superponer estas series, una podría dominar el gráfico, haciendo que el otro pase desapercibido.

Para resolver este tipo de problemas, Matplotlib ofrece la función twinx(), que permite agregar un segundo eje Y al mismo gráfico. Este método es ideal para mostrar datos con diferentes escalas en una única visualización, conservando claridad y precisión.

En esta entrada, explicaremos cómo usar twinx(), implementarlo con ejemplos prácticos y personalizarlo para tus necesidades.

Para qué sirve twinx() de Matplotlib

La función twinx() de Matplotlib permite crear un segundo eje Y en un gráfico existente. Este nuevo eje comparte el eje X con el gráfico original, pero tiene su propia escala independiente. Lo que facilita:

  • Superponer dos gráficos diferentes con escalas Y distintas.
  • Facilitar la comparación visual de datos relacionados.

Ventajas de usar twinx() en Matplotlib

Algunas de las ventajas que ofrece el uso de twinx() de Matplotlib es nuestros gráficos son:

  • Claridad visual: Ambos conjuntos de datos se presentan en el mismo espacio visual, pero con escalas separadas.
  • Personalización: Cada eje Y puede tener etiquetas, colores y estilos propios.
  • Eficiencia: Permite comparar series relacionadas sin necesidad de gráficos separados.

Ejemplo práctico: Comparar temperatura y ventas de helados

Imaginemos un conjunto de datos que contiene las temperaturas promedio y las ventas de helados por mes en un año. El siguiente código muestra cómo definir los valores y crear una gráfica con estas características.

import matplotlib.pyplot as plt

# Datos ficticios
meses = ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"]
temperaturas = [5, 7, 12, 18, 22, 27, 30, 28, 24, 18, 12, 7]
ventas_helados = [200, 250, 300, 500, 700, 900, 1200, 1100, 800, 400, 300, 250]

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

# Graficar la temperatura en el primer eje
ax1.plot(meses, temperaturas, color='blue', marker='o', label="Temperatura (°C)")
ax1.set_xlabel("Meses")
ax1.set_ylabel("Temperatura (°C)", color='blue')
ax1.tick_params(axis='y', labelcolor='blue')

# Crear un segundo eje Y compartiendo el eje X
ax2 = ax1.twinx()
ax2.plot(meses, ventas_helados, color='red', marker='s', label="Ventas de helados")
ax2.set_ylabel("Ventas de helados", color='red')
ax2.tick_params(axis='y', labelcolor='red')

# Títulos y leyendas
plt.title("Relación entre temperatura y ventas de helados")
fig.tight_layout()
plt.show()

Obteniendo como resultado una gráfica donde el eje Y izquierdo muestra la escala de temperatura (°C), mientras que el eje Y derecho muestra la escala de ventas de helados. Ambos gráficos comparten el eje X con los meses del año, como se puede ver en la siguiente figura.

Relación entre la temperatura (°C) y las ventas de helados (unidades), representadas con escalas distintas mediante twinx.

Personalización de twinx()

Como casi todas las funciones de Matplotlib existen múltiples opciones de personalización para adaptar la salida a nuestras necesidades concretar.

Usar diferentes estilos para cada eje

Puedes personalizar los colores, las líneas y los marcadores para diferenciar claramente ambos conjuntos de datos.

# Personalizar estilos
ax1.plot(meses, temperaturas, color='blue', linestyle='--', linewidth=2, marker='o', label="Temperatura (°C)")
ax2.plot(meses, ventas_helados, color='red', linestyle='-', linewidth=2, marker='s', label="Ventas de helados")

Agregar leyendas específicas para cada eje Y

Las leyendas pueden ayudar a interpretar gráficos con múltiples ejes, por eso se puede agregar una leyenda específica a cada eje.

# Agregar leyendas específicas
ax1.legend(loc='upper left')
ax2.legend(loc='upper right')

Conclusiones

El uso de twinx() en Matplotlib es una gran opción para comparar datos con diferentes escalas en un solo gráfico. Desde el análisis de tendencias climáticas hasta la exploración de relaciones económicas, esta herramienta permite crear visualizaciones claras y efectivas que destacan la relación entre variables.

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez
Tags: Matplotlib

Recent Posts

PSI: Cómo Saber Cuándo tu Modelo de Credit Scoring se ha Degradado

Un modelo de credit scoring no es un artefacto estático. Se construye en un momento…

7 horas ago

Los indicadores que se autocumplen, o cuando medir es modificar – El bestiario de los indicadores económicos absurdos (parte 7)

En las seis entregas anteriores hemos paseado por casi todos los géneros del disparate económico:…

5 días ago

Customer Lifetime Value: la fórmula clásica que todo analista debería dominar

El Customer Lifetime Value (CLV) es, probablemente, la métrica más importante que puede calcular una…

1 semana ago

Analytics Lane lanza la versión 1.4 del laboratorio con nuevas herramientas de conversión y modelos avanzados de CLV

Seguimos ampliando el laboratorio de Analytics Lane con el lanzamiento de la versión 1.4, que…

2 semanas ago

Lanzamos el video de ScoreFlow: crea scorecards de crédito de forma ágil y sin IT

En Analytics Lane seguimos apostando por desarrollar herramientas que simplifiquen el trabajo de analistas y…

2 semanas ago

This website uses cookies.