Una pequeña intro a las subplots de Matplotlib
Tags: python, matplotlib, visualization, datascience
Published: 2023-01-11 05:42:36

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)
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ham86piof0ll9xdgfjj0.png)

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)
```
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()
```


![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/unyhr9z5cf8z8vkdwhx2.png)

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()
```

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)
```

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()
```

![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qd0b7kkyksk78r4ktfne.png)

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()
```


![](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/966q7z2t63sz60tn3w45.png)

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