Grade no Matplotlib
Aprenda a criar layouts de grade com múltiplos gráficos e adicionar linhas de grade de fundo no Matplotlib usando subplots, GridSpec, subplot_mosaic e opções de estilo.
O Matplotlib suporta dois usos distintos da palavra "grid": layouts de grade com múltiplos gráficos (organizar vários eixos lado a lado em uma figura) e linhas de grade de fundo (as linhas de referência desenhadas atrás dos dados em um único eixo). Este capítulo cobre ambos, começando pelos layouts de grade e terminando com o estilo das linhas de grade.
Você já deve estar familiarizado com a criação de gráficos básicos — se não estiver, consulte primeiro os capítulos Matplotlib Plotting e Matplotlib Subplot.
Layouts de Grade com Múltiplos Gráficos
Quando você precisa exibir vários gráficos relacionados em uma única figura, você os organiza em uma grade de linhas e colunas. O Matplotlib oferece três abordagens, cada uma adequada para diferentes níveis de complexidade.
plt.subplots() — o método rápido
plt.subplots(nrows, ncols) é a rota mais rápida para grades uniformes em que cada subplot tem o mesmo tamanho. Ele retorna uma Figure e um array 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 automaticamente o espaçamento para que títulos e rótulos de eixo não se sobreponham. Passe figsize=(largura, altura) em polegadas para controlar o tamanho geral da figura.
Compartilhando eixos
Quando os gráficos compartilham a mesma escala, você pode vincular seus eixos para que ao ampliar um, todos sejam ampliados:
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 o intervalo do eixo y entre os dois subplots; sharex=True faz o mesmo para o eixo x.
GridSpec — células de tamanhos variáveis
GridSpec permite atribuir pesos diferentes a linhas e colunas, de modo que alguns subplots possam ser mais altos ou mais largos do que outros. Ele também permite que um único subplot abranja várias células.
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 principais do GridSpec:
| Argumento | O que faz |
|---|---|
width_ratios=[2, 1, 1] | Larguras das colunas como proporções relativas |
height_ratios=[1, 2] | Alturas das linhas como proporções relativas |
hspace=0.4 | Espaço vertical entre as linhas (fração da altura do eixo) |
wspace=0.3 | Espaço horizontal entre as colunas (fração da largura do eixo) |
O fatiamento com gs[linha, col] funciona como no NumPy: gs[1, :] abrange todas as colunas; gs[:, 0] abrange todas as linhas da primeira coluna.
subplot_mosaic() — layout a partir de uma string
Introduzido no Matplotlib 3.3, subplot_mosaic() permite descrever o layout com uma string ou lista aninhada que se parece com um mapa ASCII da figura. Esta é frequentemente a abordagem mais legível para layouts assimé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 na string torna-se um Axes. Letras repetidas na mesma linha/coluna fazem com que o subplot abranja essas células. O dicionário axes retornado usa o rótulo como chave, tornando o acesso aos painéis por nome mais claro do que a indexação numérica.
Controlando o espaçamento: tight_layout vs constrained_layout
Dois sistemas integrados gerenciam o espaçamento automático:
plt.tight_layout()— chame-o antes deplt.show(). Ajusta os parâmetros do subplot para que rótulos e títulos caibam. Simples e confiável para a maioria dos layouts.constrained_layout=True— passe-o paraplt.subplots()ouplt.figure(). Resolve um sistema de restrições no momento do desenho; lida melhor com barras de cor e supertítulos do que otight_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()Não use ambos ao mesmo tempo — eles entram em conflito. constrained_layout é a opção mais moderna.
Para controle manual, fig.subplots_adjust(left, right, top, bottom, hspace, wspace) substitui o espaçamento automático completamente.
Linhas de Grade de Fundo
Em um único eixo, ax.grid() desenha linhas de referência nas posições dos marcadores de escala. Estas são diferentes da grade de layout descrita acima — são guias visuais desenhadas atrás dos dados plotados.
Ativando as linhas de grade
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()Estilizando as linhas de grade
Passe argumentos de palavra-chave para ax.grid() para alterar a aparência:
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()Linhas de grade principais e secundárias
O Matplotlib distingue marcadores de escala principais (os rotulados) dos secundários (subdivisões sem rótulo). Você pode exibir linhas de grade em ambos os níveis:
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()Ativando marcadores secundários sem o localizador
Se você quiser apenas exibir marcadores secundários sem posicioná-los manualmente:
ax.minorticks_on()
ax.grid(True, which="both")Estilizando com folhas de estilo do Matplotlib
As linhas de grade também são controladas por folhas de estilo. O estilo seaborn-v0_8-whitegrid, por exemplo, ativa linhas de grade horizontais automaticamente:
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()Execute plt.style.available para listar todos os estilos integrados.
Escolhendo a Abordagem Certa
| Objetivo | Melhor ferramenta |
|---|---|
| Grade de subplots com tamanhos iguais | plt.subplots(nrows, ncols) |
| Subplots com tamanhos diferentes ou que abrangem células | GridSpec |
| Layout assimétrico descrito visualmente | subplot_mosaic() |
| Linhas de referência atrás dos dados | ax.grid() |
| Posicionamento refinado de marcadores para linhas de grade | MultipleLocator + ax.grid(which=...) |
Capítulos Relacionados
- Matplotlib Subplot — aprofundamento em
plt.subplots()e objetos de eixo - Matplotlib Labels — adicionando títulos, rótulos de eixo e anotações
- Matplotlib Plotting — gráficos de linha, gráficos de barras e gráficos de pizza
- Matplotlib Scatter — gráficos de dispersão e personalização de marcadores