W3docs

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:

ArgumentoQué hace
width_ratios=[2, 1, 1]Anchos de columna como proporciones relativas
height_ratios=[1, 2]Alturas de fila como proporciones relativas
hspace=0.4Espacio vertical entre filas (fracción de la altura del eje)
wspace=0.3Espacio 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 de plt.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 a plt.subplots() o plt.figure(). Resuelve un sistema de restricciones en el momento del dibujo; gestiona mejor las barras de color y los suptitles que tight_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

ObjetivoMejor herramienta
Cuadrícula de subgráficos de igual tamañoplt.subplots(nrows, ncols)
Subgráficos de diferentes tamaños o que abarcan celdasGridSpec
Diseño asimétrico descrito visualmentesubplot_mosaic()
Líneas de referencia detrás de los datosax.grid()
Colocación precisa de marcas para líneas de cuadrículaMultipleLocator + ax.grid(which=...)

Capítulos relacionados

Was this page helpful?