Creación de Subplots en Matplotlib

MatplotlibBeginner
Practicar Ahora

Introducción

En la visualización de datos, a menudo es útil mostrar múltiples gráficos en una sola figura. Esto permite una fácil comparación entre diferentes conjuntos de datos o diferentes vistas de los mismos datos. Matplotlib proporciona una forma potente y conveniente de crear dichas figuras utilizando subplots.

La forma más común de crear subplots es con la función plt.subplots(). Esta función crea una figura y una cuadrícula de subplots en una sola llamada, devolviendo un objeto Figure y una matriz de objetos Axes, que representan cada subplot individual.

En este laboratorio, aprenderá a:

  • Crear una figura que contenga múltiples subplots.
  • Trazar datos en subplots específicos.
  • Ajustar el diseño para evitar que los gráficos se superpongan.
  • Compartir ejes entre subplots para comparaciones más claras.

Escribirá y ejecutará scripts de Python en el WebIDE. Dado que este entorno no admite ventanas GUI interactivas, guardará sus gráficos como archivos de imagen y los verá directamente en el editor.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 100%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Crear figura y ejes usando plt.subplots()

En este paso, comenzará creando una figura que contiene dos subplots vacíos dispuestos en una fila y dos columnas. Este es el paso fundamental para construir visualizaciones de múltiples gráficos.

Utilizaremos la función plt.subplots(). Cuando llama a plt.subplots(nrows, ncols), devuelve dos elementos:

  1. Un objeto Figure, que es la ventana o página general sobre la que se dibuja todo. Normalmente lo asignamos a una variable llamada fig.
  2. Una matriz de objetos Axes. Cada objeto Axes representa uno de los subplots en la cuadrícula. Puede acceder a ellos por su índice. Para una cuadrícula de (1, 2), podemos desempaquetar esta matriz en dos variables, ax1 y ax2.

Escribamos el código. Abra el archivo main.py desde el explorador de archivos de la izquierda y agregue el siguiente contenido. Este script importará las bibliotecas necesarias, creará una figura con dos subplots y la guardará como un archivo de imagen llamado plot1.png.

import matplotlib.pyplot as plt
import numpy as np

## Create a figure and a set of subplots.
## 1 row, 2 columns.
fig, (ax1, ax2) = plt.subplots(1, 2)

## Save the figure to a file.
## The file will be created in the /home/labex/project directory.
plt.savefig('plot1.png')

print("Figure saved as plot1.png")

Ahora, ejecute el script desde la terminal para generar el gráfico.

python3 main.py

Debería ver la siguiente salida en su terminal:

Figure saved as plot1.png

Aparecerá un nuevo archivo llamado plot1.png en el explorador de archivos. Haga doble clic en él para ver su primera figura con dos subplots vacíos.

Plot1

Graficar en el primer subplot usando ax1.plot()

En este paso, aprenderá a dibujar un gráfico en uno de los objetos Axes específicos que creó. Cada objeto Axes tiene sus propios métodos de trazado, como plot(), bar(), scatter(), etc., que son similares a las funciones de la interfaz principal plt.

Trazaremos una onda sinusoidal simple en el primer subplot, que está representado por la variable ax1. También agregaremos un título a este subplot usando el método set_title().

Actualice su archivo main.py con el siguiente código. Estamos agregando la generación de datos usando NumPy y luego trazándola en ax1.

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y)
ax1.set_title('Sine Wave')

## Save the figure to a new file
plt.savefig('plot2.png')

print("Figure saved as plot2.png")

Ahora, ejecute el script actualizado en la terminal.

python3 main.py

Verá esta salida:

Figure saved as plot2.png

Un nuevo archivo, plot2.png, se encuentra ahora en su directorio de proyecto. Ábralo para ver el resultado. El subplot izquierdo ahora debería contener un gráfico de onda sinusoidal, mientras que el derecho permanece vacío.

Plot2

Graficar en el segundo subplot usando ax2.plot()

En este paso, completará la figura agregando un gráfico al segundo subplot. El proceso es idéntico al paso anterior, pero esta vez llamará al método plot() en el objeto ax2.

Trazaremos una onda coseno en el segundo subplot para compararla con la onda sinusoidal. También le daremos un título.

Modifique su archivo main.py para incluir el trazado en el segundo eje.

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.sin(x ** 2)
y2 = np.cos(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y1)
ax1.set_title('Sine Wave')

## Plot on the second subplot (ax2)
ax2.plot(x, y2, 'tab:orange')
ax2.set_title('Cosine Wave')

## Save the figure to a new file
plt.savefig('plot3.png')

print("Figure saved as plot3.png")

En el código anterior, agregamos 'tab:orange' a la llamada ax2.plot() para cambiar el color de la línea, haciendo que los gráficos sean visualmente distintos.

Ejecute el script nuevamente desde la terminal.

python3 main.py

La salida será:

Figure saved as plot3.png

Ahora, abra plot3.png. Verá una figura completa con dos gráficos uno al lado del otro. Sin embargo, podría notar que los títulos o las etiquetas de los ejes podrían estar un poco apretados. Solucionaremos eso en el próximo paso.

Plot3

Ajustar el diseño del subplot usando plt.tight_layout()

En este paso, aprenderá a ajustar automáticamente el espaciado entre los subplots para evitar que los títulos y las etiquetas se superpongan. Matplotlib proporciona una función sencilla para esto: plt.tight_layout().

Esta función examina los cuadros delimitadores de todos los artistas en la figura (como títulos, etiquetas y los propios gráficos) y ajusta los parámetros del subplot para que todo encaje ordenadamente sin superponerse. Es una buena práctica llamarla justo antes de guardar o mostrar su gráfico.

Agreguemos plt.tight_layout() a nuestro script. Actualice main.py de la siguiente manera:

import matplotlib.pyplot as plt
import numpy as np

## Create some data
x = np.linspace(0, 2 * np.pi, 400)
y1 = np.sin(x ** 2)
y2 = np.cos(x ** 2)

## Create a figure and a set of subplots
fig, (ax1, ax2) = plt.subplots(1, 2)

## Plot on the first subplot (ax1)
ax1.plot(x, y1)
ax1.set_title('Sine Wave')

## Plot on the second subplot (ax2)
ax2.plot(x, y2, 'tab:orange')
ax2.set_title('Cosine Wave')

## Adjust layout to prevent overlap
plt.tight_layout()

## Save the figure to a new file
plt.savefig('plot4.png')

print("Figure saved as plot4.png")

El único cambio es la adición de la línea plt.tight_layout(). Ahora, ejecute el script.

python3 main.py

Salida:

Figure saved as plot4.png

Abra plot4.png y compárelo con plot3.png. Debería notar que el espaciado entre los dos subplots se ha optimizado, proporcionando una figura más limpia y de aspecto más profesional.

Plot4

Compartir ejes usando sharex=True o sharey=True

En este paso, aprenderá a crear subplots que comparten un eje común. Esto es particularmente útil cuando se comparan conjuntos de datos que tienen la misma escala en el eje x o y. Cuando los ejes se comparten, el zoom o el desplazamiento en un subplot actualizará automáticamente el otro. También ayuda a despejar la figura eliminando etiquetas de marcas redundantes.

Puede habilitar el uso compartido de ejes pasando los argumentos sharex=True o sharey=True a plt.subplots().

Para demostrar esto, creemos un nuevo script. Cree un archivo llamado shared_axes.py en su directorio de proyecto y agregue el siguiente código. Este ejemplo creará dos subplots apilados verticalmente (nrows=2, ncols=1) que comparten el mismo eje x.

import matplotlib.pyplot as plt
import numpy as np

## Create data
t = np.arange(0.01, 5.0, 0.01)
s1 = np.exp(t)
s2 = np.sin(2 * np.pi * t)

## Create a figure and two subplots that share the x-axis
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)

## Plot on the first subplot
ax1.plot(t, s1, 'tab:blue')
ax1.set_ylabel('Exponential')

## Plot on the second subplot
ax2.plot(t, s2, 'tab:orange')
ax2.set_ylabel('Sinusoidal')
ax2.set_xlabel('time (s)')

## Adjust layout
plt.tight_layout()

## Save the figure
plt.savefig('plot5.png')

print("Figure saved as plot5.png")

Ahora, ejecute este nuevo script desde la terminal.

python3 shared_axes.py

Salida:

Figure saved as plot5.png

Abra plot5.png. Observe que las etiquetas de las marcas del eje x solo están presentes en el subplot inferior (ax2). Esto se debe a que sharex=True oculta automáticamente las etiquetas internas del eje x para crear una apariencia más limpia. Ambos gráficos están perfectamente alineados a lo largo del eje x, lo que facilita su comparación.

Plot5

Resumen

¡Felicitaciones por completar el laboratorio! Ha aprendido las técnicas esenciales para crear y gestionar subplots en Matplotlib.

En este laboratorio, practicó:

  • Usar plt.subplots() para crear una figura con una cuadrícula de subplots.
  • Acceder a objetos Axes individuales y usar sus métodos para graficar datos.
  • Agregar títulos a subplots específicos.
  • Usar plt.tight_layout() para ajustar automáticamente el espaciado y evitar la superposición de elementos.
  • Crear subplots con ejes compartidos usando sharex=True para una comparación de datos más clara y una figura más limpia.

Estas habilidades son fundamentales para crear visualizaciones de datos complejas e informativas. Ahora puede construir figuras que comparen eficazmente múltiples conjuntos de datos en una vista única y coherente.