DEV Community

Guillermo
Guillermo

Posted on

Una pequeña intro a las subplots de Matplotlib

En este muy pequeño post nos centraremos en la tarea de crear varios gráficos en una sola imagen con la librería Matplotlib.

La manera más fácil de lograr nuestra tarea es usando matplotlib.pyplot.subplots. Este método retorna una tupla (fig, ax), donde fig hace referencia a Figure el cual es la imagen contenedora de todos los sub-gráficos, y ax hace referencia a un arreglo de Axes, estos se refieren a cada sub-gráfico de manera individual.

Al método anterior le podemos especificar el número de filas y columnas para generar tantos sub-gráficos como nosotros consideremos necesario. Para entender esto de mejor manera pasemos al código:

import matplotlib.pyplot as plt
plt.style.use('ggplot')
fig, ax = plt.subplots(figsize=(12,4) ,nrows=1, ncols=3)
Enter fullscreen mode Exit fullscreen mode

Image description

Ahora veamos como graficar en los espacios generados, para esto crearemos unos datos con ayuda de numpy.

import numpy as np
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.cos(x**2)
y2 = np.sin(x**2)
y3 = np.floor(x**2)
Enter fullscreen mode Exit fullscreen mode

Ahora sí grafiquemos estas tres funciones:

fig, ax = plt.subplots(figsize=(16,4) ,nrows=1, ncols=3)
ax[0].plot(x, y1, color='#581845', linestyle='dashed')
ax[0].set_title('Función coseno')
ax[1].plot(x, y2, color='#0C0C0E', linestyle='dashdot')
ax[1].set_title('Función seno')
ax[2].plot(x, y3, color='#D42D2D')
ax[2].set_title('Función piso')
plt.show()
Enter fullscreen mode Exit fullscreen mode

Alternativamente podemos desempacar los Axes como una tupla:

fig, (ax1, ax2, ax3) = plt.subplots(figsize=(16,4) ,nrows=1, ncols=3)
ax1.plot(x, y1, color='#581845', linestyle='dashed')
ax1.set_title('Función coseno')
ax2.plot(x, y2, color='#0C0C0E', linestyle='dashdot')
ax2.set_title('Función seno')
ax3.plot(x, y3, color='#D42D2D')
ax3.set_title('Función piso')
plt.show()
Enter fullscreen mode Exit fullscreen mode

Y el resultado será el mismo. Aquí ya es una cuestión de gustos el cómo manejar a los Axes.

Ahora generemos un arreglo bidimensional de sub-gráficos y veamos que podemos acceder a cada uno de ellos con índices, como si se tratara de una matriz.

Pero antes de graficar necesitamos crear una cuarta función para poder llenar el último espacio, así que creemos dicha función:

y4=np.exp(x)
Enter fullscreen mode Exit fullscreen mode

Ahora si procedamos a hacer nuestras gráficas:

fig, ax = plt.subplots(figsize=(16,8) ,nrows=2, ncols=2)
ax[0, 0].plot(x, y1, color='#581845', linestyle='dashed')
ax[0, 0].set_title('Función coseno')
ax[0, 1].plot(x, y2, color='#0C0C0E', linestyle='dashdot')
ax[0, 1].set_title('Función seno')
ax[1, 0].plot(x, y3, color='#D42D2D')
ax[1, 0].set_title('Función piso')
ax[1, 1].plot(x, y4, color='#0B13BE')
ax[1, 1].set_title('Función exponencial')
plt.show()
Enter fullscreen mode Exit fullscreen mode

Este ejemplo es muy sencillo y todas las funciones las generamos a partir del mismo dominio (eje X). Sin embargo, puede que también en un caso que estemos estudiando los datos compartan algún eje, por lo que resultaría útil que nuestra imagen no muestre el eje dos veces sino que simplemente se comparta. Lo anterior lo podemos lograr con sharex o sharey.

fig, ax = plt.subplots(figsize=(16,8) ,nrows=2, ncols=2, sharex=True)
ax[0, 0].plot(x, y1, color='#581845', linestyle='dashed')
ax[0, 0].set_title('Función coseno')
ax[0, 1].plot(x, y2, color='#0C0C0E', linestyle='dashdot')
ax[0, 1].set_title('Función seno')
ax[1, 0].plot(x, y3, color='#D42D2D')
ax[1, 0].set_title('Función piso')
ax[1, 1].plot(x, y4, color='#0B13BE')
ax[1, 1].set_title('Función exponencial')
plt.show()
Enter fullscreen mode Exit fullscreen mode

Muchas más cosas se pueden personalizar con la finalidad de realizar la visualización que nosotros queramos, pero la idea era hacer este post muy conciso y corto, ya trataremos con mayor profundidad este y otros temas en próximas entradas.

Mil gracias por leer, excelente día :D

Top comments (0)