Uso de múltiples ejes en Matplotlib

Publicado el 04 agosto 2022 por Daniel Rodríguez @analyticslane

En algunas situaciones puede ser interesante incluir más de una serie de datos en una gráfica, facilitando así la comparación de los patrones existentes en ambas. Cuando las dos series comparten las mismas unidades es posible representarlas en el mismo eje, pero no así cuando son diferentes. Siendo necesario en estos casos usar un eje diferente para cada una de las series. Algo que se puede conseguir mediante el uso de múltiples ejes en Matplotlib, característica disponible tanto para el eje de ordenadas como para el de abscisas.

Múltiples ejes de ordenadas en Matplotlib

El método para agregar un nuevo eje de ordenadas en Matplotlib a una figura es twinx(). Cuando se llama a este método se crea un segundo eje y que comparte el eje x con el actual. Pudiéndose usar a partir de este momento el nuevo objeto para representar cualquier serie de datos.

La forma más sencilla de ver esto es con un ejemplo. En el caso de que contemos con los datos de la altura en centímetros y los pesos en kilogramos de un conjunto de usuarios podemos pensar en representar ambos valores en una única gráfica. Debido a que la estatura de las personas se suele mover en el rango de las centenas y el peso en decenas, usar el mismo eje no es una opción. Así lo que se puede hacer es crear una primera gráfica con la estatura, y una vez hecho esto crear una segunda eje con twinx() en el que se puede representar el peso. Algo como lo que se muestra en el siguiente código.

import matplotlib.pyplot as plt

name = ['Aguistin', 'Fionnula', 'Connie', 'Rad', 'Marlow']
heights = [192, 156, 162, 185, 196]
weight = [78, 52, 56, 72, 85]

fig, axes = plt.subplots()

axes.bar(name, heights, color='b')
axes.set_xlabel('Nombre')
axes.set_ylabel('Estatura en cms', color='b')

twin_axes = axes.twinx() 
twin_axes.plot(name, weight, 'r')
twin_axes.set_ylabel('Peso en kg', color='r')

plt.show()

Con lo que se produce la siguiente gráfica.

Representación en Matplotlib del peso y la altura de los usuarios en una gráfica con dos ejes.

Nótese que en este ejemplo en primer lugar se crea una figura y en los ejes de esta se representa un gráfico de barras con el nombre y la altura. Agregándoles tanto al eje x como al eje y una etiqueta. Para facilitar la lectura de los datos, en el caso del eje y, se usa el mismo color para la etiqueta que para la serie de datos.

Una vez creada la primera gráfica se procede a la creación de un nuevo eje. Para lo que se usa el método twinx(). Empleando el eje que devuelve este método para crear una gráfica con el peso en kilogramos asociado a la altura. Siendo necesario únicamente en este caso agregar la etiqueta para el eje y, agregando también el color para facilitar la interpretación de la figura resultante. Siendo necesario agregar una para el eje x ya que este se comparte con la anterior. Una vez hecho esto se puede representar el gráfico con el método plot().

Múltiples ejes de abscisas en Matplotlib

Lo que se ha hecho para en el ejemplo anterior para el eje de ordenadas también se puede hacer para el de abscisas. En este caso el método que se debe llamar es twiny(). Al igual que el anterior este crea y devuelve un nuevo eje x que comparte el y con el actual.

Esto es algo que se puede ver en el siguiente ejemplo donde se tiene dos series que suceden en distintos instantes de tiempo. Al igual que el caso anterior, primero se dibuja la primera serie para posteriormente crear un nuevo eje y sobre este representar la segunda.

import numpy as np
import matplotlib.pyplot as plt

x_1 = np.linspace(0, np.pi, 200)
y_1 = np.cos(3 * np.pi * x_1)

x_2 = np.linspace(10, 14, 200)
y_2 = np.cos(np.pi * x_2)

fig, axes = plt.subplots()

axes.plot(x_1, y_1, 'b')
axes.set_xlabel('Tiempo', color='b')
axes.set_ylabel('Amplitud')

twin_axes = axes.twiny()
twin_axes.plot(x_2, y_2, 'r')
twin_axes.set_xlabel('Tiempo (2)', color='r')

plt.show()

Los que producen como resultado la siguiente figura.

Uso de múltiples ejes x en Matplotlib para compara dos series que se producen en diferentes momentos

Al igual que en el ejemplo de la sección anterior se ha usado el mismo color para la serie que para la etiqueta del eje, algo que facilita la interpretación de los datos.

Conclusiones

En la publicación de hoy se ha visto cómo se pueden crear y usar múltiples ejes en Matplotlib para representar series de datos que no comparten unidades. Pudiendo crear de este modo gráficos en los que se puede comparar la evolución de diferentes variables.