W3docs

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:

ArgumentoO 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.4Espaço vertical entre as linhas (fração da altura do eixo)
wspace=0.3Espaç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 de plt.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 para plt.subplots() ou plt.figure(). Resolve um sistema de restrições no momento do desenho; lida melhor com barras de cor e supertítulos do que o 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()

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

ObjetivoMelhor ferramenta
Grade de subplots com tamanhos iguaisplt.subplots(nrows, ncols)
Subplots com tamanhos diferentes ou que abrangem célulasGridSpec
Layout assimétrico descrito visualmentesubplot_mosaic()
Linhas de referência atrás dos dadosax.grid()
Posicionamento refinado de marcadores para linhas de gradeMultipleLocator + ax.grid(which=...)

Capítulos Relacionados

Was this page helpful?