Matplotlib es la biblioteca fundamental para la generación de gráficos en el ecosistema científico de Python. Permite construir desde visualizaciones sencillas hasta figuras complejas de calidad editorial, ofreciendo un control total sobre cada elemento del lienzo.
Estructura de la figura y elementos del gráfico
En Matplotlib, una viusalización se compone de una Figure (el contenedor global) y uno o más Axes (el área donde se dibujan los datos). A continuación, se muestra cómo configurar estos elmeentos manualmente:
import numpy as np
import matplotlib.pyplot as plt
# Configuración de estilo global
plt.rcParams["axes.unicode_minus"] = False # Manejo de signos negativos
# Generación de datos sintéticos
tiempo = np.linspace(0, 10, 100)
señal_a = np.sin(tiempo)
señal_b = np.cos(tiempo)
# Inicialización del lienzo
figura = plt.figure(figsize=(12, 5), facecolor="#f0f0f0")
figura.suptitle("Análisis de Ondas Senoidales", fontsize=16)
# Primer subgráfico
ax1 = figura.add_subplot(1, 2, 1)
ax1.plot(tiempo, señal_a, color="blue", label="Seno")
ax1.set_title("Onda A")
ax1.set_xlabel("Tiempo (s)")
ax1.set_ylabel("Amplitud")
ax1.grid(True, linestyle="--")
ax1.legend()
# Segundo subgráfico
ax2 = figura.add_subplot(1, 2, 2)
ax2.plot(tiempo, señal_b, color="red", linestyle="--", label="Coseno")
ax2.set_title("Onda B")
ax2.set_xlabel("Tiempo (s)")
ax2.set_ylim(-1.5, 1.5)
ax2.legend(loc="upper right")
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
plt.show()
Personalización avanzada y estilos
Matplotlib permite modificar la estética mediante hojas de estilo predefinidas y configuraciones en el diccionario rcParams. También es posible manejar ejes secundarios y escalas personalizadas.
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator
# Aplicar un estilo predefinido
plt.style.use("ggplot")
datos_x = np.linspace(0, 5, 50)
datos_y = np.exp(datos_x)
fig, eje_principal = plt.subplots()
# Eje secundario compartiendo el eje X
eje_secundario = eje_principal.twinx()
eje_principal.plot(datos_x, datos_y, 'g-', label="Exponencial")
eje_secundario.plot(datos_x, np.log1p(datos_x), 'b--', label="Logarítmica")
eje_principal.set_xlabel("Escala X")
eje_principal.set_ylabel("Valor Exp", color='g')
eje_secundario.set_ylabel("Valor Log", color='b')
# Configuración de etiquetas menores
eje_principal.xaxis.set_minor_locator(AutoMinorLocator())
plt.title("Comparativa de Escalas")
plt.show()
Organización de layouts complejos
Para diseños que no siguen una cuadrícula unifrome, se utiliza GridSpec o la inserción de ejes manuales para crear gráficos anidados.
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10, 8))
cuadricula = fig.add_gridspec(2, 2)
# Gráfico que ocupa toda la fila superior
ax_top = fig.add_subplot(cuadricula[0, :])
ax_top.bar(["Enero", "Febrero", "Marzo"], [10, 25, 15])
# Gráficos en la fila inferior
ax_left = fig.add_subplot(cuadricula[1, 0])
ax_left.pie([30, 70], labels=["A", "B"])
ax_right = fig.add_subplot(cuadricula[1, 1])
ax_right.scatter(np.random.rand(10), np.random.rand(10))
# Subgráfico anidado (Inlay)
ax_inlay = fig.add_axes([0.6, 0.15, 0.1, 0.1])
ax_inlay.plot([1, 2, 3], [3, 2, 1])
plt.show()
Galería de tipos de gráficos esenciales
Matplotlib soporta una amplia variedad de representaciones estadísticas y categóricas.
# Configuración de múltiples gráficos
fig, ejes = plt.subplots(2, 2, figsize=(12, 10))
categorias = ['G1', 'G2', 'G3', 'G4']
valores = [20, 35, 30, 27]
errores = [2, 3, 4, 1]
# 1. Gráfico de Barras con barras de error
ejes[0, 0].bar(categorias, valores, yerr=errores, capsize=5, color="skyblue")
ejes[0, 0].set_title("Barras con Error")
# 2. Histograma
muestras = np.random.normal(100, 15, 500)
ejes[0, 1].hist(muestras, bins=25, color="orange", alpha=0.7)
ejes[0, 1].set_title("Distribución Normal")
# 3. Gráfico de dispersión (Scatter)
x = np.random.randn(50)
y = np.random.randn(50)
colores = np.random.rand(50)
tamaños = 500 * np.random.rand(50)
ejes[1, 0].scatter(x, y, c=colores, s=tamaños, alpha=0.5, cmap='viridis')
ejes[1, 0].set_title("Scatter Plot Multidimensional")
# 4. Boxplot para análisis de valores atípicos
datos_box = [np.random.normal(0, std, 100) for std in range(1, 4)]
ejes[1, 1].boxplot(datos_box, vert=True, patch_artist=True)
ejes[1, 1].set_title("Diagrama de Caja")
plt.tight_layout()
plt.show()
Mapas de Colores (Colormaps)
La elección del color es crucial para la interpretación. Matplotlib clasifica sus cmap en tres categorías principales:
- Secuenciales: Para datos que varían de bajo a alto (ej.
viridis,magma,Blues). - Divergentes: Para resaltar desviaciones desde un punto central (ej.
coolwarm,RdBu). - Cualitativos: Para variables categóricas sin orden intrínseco (ej.
tab10,Set3).
# Ejemplo de mapa de calor (Heatmap)
matriz = np.random.random((10, 10))
plt.imshow(matriz, cmap='inferno', interpolation='nearest')
plt.colorbar(label="Intensidad")
plt.title("Visualización de Matriz con Heatmap")
plt.show()