Introducción a los subplots en Matplotlib
Matplotlib es una biblioteca de Python ampliamente utilizada para la visualización de datos, permitiendo la generación de gráficos estáticos y dinámicos. Una característica clave es la capacidad de organizar múltiples gráficos dentro de una sola figura mediante subplots, lo que facilita la comparación y análisis de datos relacionados. En este tutorial, exploraremos diversas técnicas para crear y personalizar subplots, incluyendo ejemplos de código que ilustrna métodos comunes.
Creación básica de subplots con pyplot
Para generar una cuadrícula de subplots, se puede emplear la función subplot() de Matplotlib, que especifica el número de filas, columnas y el índice del subplot activo. A continuación, un ejemplo que muestra dos gráficos dispuestos verticalmente:
import matplotlib.pyplot as plt
import numpy as np
# Generación de datos de ejemplo
t = np.linspace(0, 5, 200)
func1 = np.exp(-0.5 * t) * np.sin(2 * np.pi * t)
func2 = np.cos(3 * t)
# Configuración del primer subplot (fila 1, columna 1)
plt.subplot(2, 1, 1)
plt.plot(t, func1, color='green')
plt.title('Función amortiguada')
# Configuración del segundo subplot (fila 2, columna 1)
plt.subplot(2, 1, 2)
plt.plot(t, func2, color='purple')
plt.title('Función coseno')
# Ajuste del diseño y visualización
plt.tight_layout()
plt.show()
Otpimización del diseño con gridspec
Para layouts más complejos, el módulo gridspec permite definir cuadrículas personalizadas. Esto resulta útil al necesitar subplots de diferentes tamaños o posiciones específicas. Veamos un caso con una cuadrícula de 3x3:
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
import numpy as np
# Definición de una figura y una cuadrícula de 3x3
fig = plt.figure()
gs = gridspec.GridSpec(3, 3)
# Creación de subplots en áreas seleccionadas
ax1 = fig.add_subplot(gs[0, :]) # Primera fila, todas las columnas
ax2 = fig.add_subplot(gs[1:, 0:2]) # Filas 2-3, columnas 1-2
ax3 = fig.add_subplot(gs[1, 2]) # Fila 2, columna 3
ax4 = fig.add_subplot(gs[2, 2]) # Fila 3, columna 3
# Asignación de datos a cada eje (ejemplo simplificado)
data_x = np.arange(0, 10, 0.1)
ax1.plot(data_x, np.sin(data_x))
ax2.plot(data_x, np.log(data_x + 1))
ax3.plot(data_x, np.tan(data_x))
ax4.plot(data_x, np.sqrt(data_x))
plt.show()
Compartir ejes entre subplots
Al compartir ejes, se sincronizan las escalas y ticks entre subplots, mejorando la comparación visual. Esto se logra mediante parámetros como sharex o sharey en subplots(). Ejemplo con eje x compartido:
import matplotlib.pyplot as plt
import numpy as np
# Datos para dos funciones
valores = np.linspace(0, 8, 150)
serie1 = np.sin(valores) * valores
serie2 = np.cos(valores) * np.exp(-0.2 * valores)
# Creación de subplots con eje x compartido
fig, ejes = plt.subplots(nrows=2, ncols=1, sharex=True)
# Graficado en cada subplot
ejes[0].plot(valores, serie1, 'r-')
ejes[0].set_ylabel('Amplitud')
ejes[0].set_title('Serie temporal 1')
ejes[1].plot(valores, serie2, 'b--')
ejes[1].set_xlabel('Tiempo (s)')
ejes[1].set_ylabel('Amplitud')
ejes[1].set_title('Serie temporal 2')
# Configuración común del eje x
ejes[1].set_xticks(np.arange(0, 9, 1))
plt.tight_layout()
plt.show()
Superposición de múltiples series en un mismo subplot
Para comparar conjuntos de datos dentro de un único gráfico, se pueden trazar varias series en el mismo subplot, usando leyendas para diferenciarlas. Ejemplo con datos sintéticos variados:
import matplotlib.pyplot as plt
import numpy as np
# Configuración de un subplot único
fig, ax = plt.subplots(figsize=(8, 5))
# Generación de múltiples series
x_vals = np.linspace(-2, 2, 100)
y1 = x_vals ** 2
y2 = x_vals ** 3
y3 = np.abs(x_vals)
# Trazado de cada serie con estilos distintos
ax.plot(x_vals, y1, label='Cuadrática', color='cyan')
ax.plot(x_vals, y2, label='Cúbica', color='magenta')
ax.plot(x_vals, y3, label='Valor absoluto', color='orange')
# Personalización de ejes y leyenda
ax.set_xlabel('Variable independiente')
ax.set_ylabel('Variable dependiente')
ax.set_title('Comparación de funciones matemáticas')
ax.legend(loc='upper left', framealpha=0.8)
ax.grid(True, linestyle='--', alpha=0.5)
plt.show()
Personalización avanzada de estilos en subplots
Matplotlib ofrece amplias opciones para estilizar gráficos, como modificar colores, marcadores y estilos de línea. Esto permite adaptar visualizaciones a requisitos específicos. Ejemplo con estilos enfatizados:
import matplotlib.pyplot as plt
import numpy as np
# Datos experimentales simulados
tiempo = np.arange(0, 10, 0.2)
medida1 = 5 + 2 * np.sin(tiempo) + np.random.normal(0, 0.3, len(tiempo))
medida2 = 4 + 1.5 * np.cos(tiempo) + np.random.normal(0, 0.2, len(tiempo))
# Creación de figura con un subplot
fig, ax = plt.subplots()
# Trazado con personalización de estilo
ax.scatter(tiempo, medida1, color='red', marker='^', s=50, alpha=0.7, label='Sensor A')
ax.plot(tiempo, medida2, color='blue', linestyle='-.', linewidth=2, label='Sensor B')
# Añadir elementos decorativos
ax.set_title('Datos de sensores con incertidumbre')
ax.set_xlabel('Tiempo (unidades)')
ax.set_ylabel('Lectura')
ax.legend(shadow=True)
ax.set_facecolor('#f0f0f0')
plt.tight_layout()
plt.show()
Estas técnicas proporcionan una base sólida para la creación de visualizaciones efectivas con múltiples subplots en Matplotlib, adaptándose a diversas necesidades de análisis de datos.