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

Síndrome del objeto brillante en ciencia de datos: el error simétrico a los costes hundidos

Hace poco publiqué una entrada en la que trataba de un sesgo bien documentado: aferrarse…

5 días ago

De la Regresión Logística al Scorecard: La Transformación Matemática

En un entrada previa explicamos qué son el WOE y el IV y por qué…

7 días ago

Analytics Lane lanza la versión 1.1 del laboratorio con nuevas suites de CLV y Scoring

Seguimos evolucionando el laboratorio de Analytics Lane y hoy lanzamos la versión 1.1, disponible en:…

1 semana ago

Interés compuesto: la fuerza que multiplica tu dinero (y los errores que la anulan)

“El interés compuesto es la octava maravilla del mundo. El que lo entiende lo gana…

2 semanas ago

Cómo comparar datos con barras en Matplotlib: agrupadas, apiladas y porcentuales

Tienes los datos de ventas de tres productos en dos años distintos y quieres saber…

2 semanas ago

Costes hundidos en ciencia de datos: cuándo mantener un modelo y cuándo migrar

Imagina la situación. Tu equipo lleva tres años con un modelo en producción. No es…

3 semanas ago

This website uses cookies.