Cuadrícula de Matplotlib
Aprende a crear diseños de cuadrícula con múltiples gráficos y agregar líneas de cuadrícula en Matplotlib usando subplots, GridSpec, subplot_mosaic y opciones de estilo.
Matplotlib admite dos usos distintos de la palabra "cuadrícula": diseños de cuadrícula con múltiples gráficos (organizar varios ejes uno al lado del otro en una figura) y líneas de cuadrícula de fondo (las líneas de referencia dibujadas detrás de los datos en un solo eje). Este capítulo cubre ambos, comenzando con las cuadrículas de diseño y terminando con el estilo de las líneas de cuadrícula.
Ya deberías estar familiarizado con el trazado básico — si no es así, consulta primero los capítulos Matplotlib Plotting y Matplotlib Subplot.
Diseños de cuadrícula con múltiples gráficos
Cuando necesitas mostrar varios gráficos relacionados en una figura, los organizas en una cuadrícula de filas y columnas. Matplotlib ofrece tres enfoques, cada uno adecuado para diferentes niveles de complejidad.
plt.subplots() — la forma rápida
plt.subplots(nrows, ncols) es la ruta más rápida para cuadrículas uniformes donde cada subgráfico tiene el mismo tamaño. Devuelve una Figure y un array de NumPy de Axes.
import matplotlib.pyplot as plt
# 2-row, 2-column grid — four equal subplots
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(8, 6))
axs[0, 0].plot([1, 2, 3], [4, 5, 6])
axs[0, 0].set_title("Line plot")
axs[0, 1].scatter([1, 2, 3], [4, 5, 6])
axs[0, 1].set_title("Scatter plot")
axs[1, 0].bar([1, 2, 3], [4, 5, 6])
axs[1, 0].set_title("Bar chart")
axs[1, 1].hist([1, 2, 3, 4, 5, 6], bins=3)
axs[1, 1].set_title("Histogram")
plt.tight_layout()
plt.show()tight_layout() ajusta automáticamente el espaciado para que los títulos y las etiquetas de las marcas no se superpongan. Pasa figsize=(width, height) en pulgadas para controlar el tamaño general de la figura.
Compartir ejes
Cuando los gráficos comparten la misma escala, puedes vincular sus ejes para que al hacer zoom en uno se aplique a todos:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 2 * np.pi, 100)
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(9, 3), sharey=True)
ax1.plot(x, np.sin(x))
ax1.set_title("sin(x)")
ax2.plot(x, np.cos(x))
ax2.set_title("cos(x)")
plt.tight_layout()
plt.show()sharey=True vincula el rango del eje y entre ambos subgráficos; sharex=True hace lo mismo para el eje x.
GridSpec — celdas de tamaño variable
GridSpec te permite asignar diferentes pesos a filas y columnas para que algunos subgráficos puedan ser más altos o más anchos que otros. También permite que un solo subgráfico abarque varias celdas.
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
fig = plt.figure(figsize=(9, 6))
# 2 rows, 3 columns; bottom row is twice as tall
gs = GridSpec(nrows=2, ncols=3, height_ratios=[1, 2], hspace=0.4, wspace=0.3)
ax_top_left = fig.add_subplot(gs[0, 0])
ax_top_mid = fig.add_subplot(gs[0, 1])
ax_top_right = fig.add_subplot(gs[0, 2])
ax_bottom = fig.add_subplot(gs[1, :]) # spans all three columns
ax_top_left.plot([0, 1, 2], [0, 1, 0])
ax_top_left.set_title("Top left")
ax_top_mid.bar([0, 1, 2], [3, 1, 4])
ax_top_mid.set_title("Top centre")
ax_top_right.scatter([0, 1, 2], [2, 7, 1])
ax_top_right.set_title("Top right")
ax_bottom.plot([0, 1, 2, 3, 4], [0, 1, 4, 9, 16], color="steelblue", linewidth=2)
ax_bottom.set_title("Bottom — full width")
plt.show()Argumentos clave de GridSpec:
| Argumento | Qué hace |
|---|---|
width_ratios=[2, 1, 1] | Anchos de columna como proporciones relativas |
height_ratios=[1, 2] | Alturas de fila como proporciones relativas |
hspace=0.4 | Espacio vertical entre filas (fracción de la altura del eje) |
wspace=0.3 | Espacio horizontal entre columnas (fracción del ancho del eje) |
El uso de índices con gs[row, col] funciona igual que en NumPy: gs[1, :] abarca todas las columnas; gs[:, 0] abarca todas las filas en la primera columna.
subplot_mosaic() — diseño a partir de una cadena
Introducido en Matplotlib 3.3, subplot_mosaic() te permite describir el diseño con una cadena o lista anidada que parece un mapa ASCII de la figura. Este suele ser el enfoque más legible para diseños asimétricos.
import matplotlib.pyplot as plt
layout = """
AB
CC
"""
fig, axes = plt.subplot_mosaic(layout, figsize=(8, 5))
axes["A"].set_title("Panel A")
axes["A"].plot([1, 2, 3], [3, 1, 2])
axes["B"].set_title("Panel B")
axes["B"].scatter([1, 2, 3], [2, 3, 1])
axes["C"].set_title("Panel C — full width")
axes["C"].bar(["x", "y", "z"], [5, 3, 7])
plt.tight_layout()
plt.show()Cada letra única en la cadena se convierte en un Axes. Las letras repetidas en la misma fila o columna hacen que ese subgráfico abarque esas celdas. El diccionario axes devuelto está indexado por etiqueta, por lo que acceder a los paneles por nombre es más claro que la indexación numérica.
Control del espaciado: tight_layout vs constrained_layout
Dos sistemas integrados gestionan el espaciado automático:
plt.tight_layout()— llámalo antes deplt.show(). Ajusta los parámetros del subgráfico para que las etiquetas y títulos quepan. Simple y confiable para la mayoría de los diseños.constrained_layout=True— pásalo aplt.subplots()oplt.figure(). Resuelve un sistema de restricciones en el momento del dibujo; gestiona mejor las barras de color y los suptitles quetight_layout.
import matplotlib.pyplot as plt
# constrained_layout keeps the super-title from overlapping the subplots
fig, axs = plt.subplots(1, 2, figsize=(8, 3), constrained_layout=True)
fig.suptitle("Two plots with constrained_layout", fontsize=13)
axs[0].plot([1, 2, 3], [1, 4, 9])
axs[0].set_title("Subplot 1")
axs[1].plot([1, 2, 3], [9, 4, 1])
axs[1].set_title("Subplot 2")
plt.show()No uses ambos al mismo tiempo — entran en conflicto. constrained_layout es la opción más moderna.
Para el control manual, fig.subplots_adjust(left, right, top, bottom, hspace, wspace) anula el espaciado automático por completo.
Líneas de cuadrícula de fondo
En un solo eje, ax.grid() dibuja líneas de referencia en las posiciones de las marcas. Estas son diferentes de la cuadrícula de diseño descrita anteriormente — son guías visuales dibujadas detrás de los datos trazados.
Activar las líneas de cuadrícula
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot([1, 2, 3, 4, 5], [2, 5, 3, 8, 6], marker="o")
# Enable gridlines on both axes
ax.grid(True)
ax.set_title("Plot with gridlines")
plt.tight_layout()
plt.show()Dar estilo a las líneas de cuadrícula
Pasa argumentos de palabras clave a ax.grid() para cambiar la apariencia:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot([1, 2, 3, 4, 5], [2, 5, 3, 8, 6], marker="o", color="steelblue")
ax.grid(
True,
which="major", # "major", "minor", or "both"
axis="both", # "x", "y", or "both"
color="gray",
linestyle="--",
linewidth=0.7,
alpha=0.7,
)
ax.set_title("Styled gridlines")
plt.tight_layout()
plt.show()Líneas de cuadrícula mayores y menores
Matplotlib distingue las marcas mayores (las etiquetadas) de las marcas menores (subdivisiones sin etiquetar). Puedes mostrar líneas de cuadrícula en ambos niveles:
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot([0, 1, 2, 3, 4, 5, 6], [0, 1, 4, 9, 16, 25, 36])
# Major gridlines every 1 unit, minor every 0.5
ax.xaxis.set_major_locator(MultipleLocator(1))
ax.xaxis.set_minor_locator(MultipleLocator(0.5))
ax.yaxis.set_major_locator(MultipleLocator(10))
ax.yaxis.set_minor_locator(MultipleLocator(5))
ax.grid(True, which="major", linestyle="-", linewidth=0.8, color="gray", alpha=0.6)
ax.grid(True, which="minor", linestyle=":", linewidth=0.5, color="silver", alpha=0.5)
ax.set_title("Major and minor gridlines")
plt.tight_layout()
plt.show()Activar marcas menores sin el localizador
Si solo quieres mostrar marcas menores sin colocarlas manualmente:
ax.minorticks_on()
ax.grid(True, which="both")Aplicar estilo con hojas de estilo de Matplotlib
Las líneas de cuadrícula también se controlan mediante hojas de estilo. El estilo seaborn-v0_8-whitegrid, por ejemplo, activa las líneas de cuadrícula horizontales automáticamente:
import matplotlib.pyplot as plt
plt.style.use("seaborn-v0_8-whitegrid")
fig, ax = plt.subplots(figsize=(6, 4))
ax.plot([1, 2, 3, 4], [3, 7, 2, 9], marker="s")
ax.set_title("seaborn-v0_8-whitegrid style")
plt.tight_layout()
plt.show()Ejecuta plt.style.available para listar todos los estilos integrados.
Cómo elegir el enfoque correcto
| Objetivo | Mejor herramienta |
|---|---|
| Cuadrícula de subgráficos de igual tamaño | plt.subplots(nrows, ncols) |
| Subgráficos de diferentes tamaños o que abarcan celdas | GridSpec |
| Diseño asimétrico descrito visualmente | subplot_mosaic() |
| Líneas de referencia detrás de los datos | ax.grid() |
| Colocación precisa de marcas para líneas de cuadrícula | MultipleLocator + ax.grid(which=...) |
Capítulos relacionados
- Matplotlib Subplot — análisis más profundo de
plt.subplots()y los objetos de ejes - Matplotlib Labels — agregar títulos, etiquetas de ejes y anotaciones
- Matplotlib Plotting — gráficos de líneas, gráficos de barras y gráficos circulares
- Matplotlib Scatter — gráficos de dispersión y personalización de marcadores