Skip to content

plt.savefig no Python: bbox_inches, DPI e rótulos cortados

Publicado em

Atualizado em

Referência prática de Matplotlib savefig: corrija rótulos cortados com bbox_inches='tight', ajuste DPI/formatos e evite imagem em branco após plt.show().

Para salvar uma figura do Matplotlib sem surpresas, comece com fig.savefig("plot.png", dpi=300, bbox_inches="tight"). Os sinais de busca em português ainda são pequenos e muito focados em plt.savefig, então esta página prioriza uma referência prática e direta.

O foco é corrigir rótulos cortados, usar bbox_inches='tight', escolher DPI e formatos, e evitar imagem em branco depois de plt.show().

Referência rápida de savefig

fig.savefig(
    "plot.png",
    dpi=300,
    bbox_inches="tight",
    pad_inches=0.1,
)
ProblemaTente primeiro
Rótulos, título ou legenda cortadosbbox_inches="tight"
Código novo em Matplotlibplt.subplots(layout="constrained")
Imagem salva em brancoChamar savefig() antes de plt.show()
Margem demais ao redorbbox_inches="tight", pad_inches=0
Saída em alta resoluçãodpi=300 ou SVG/PDF

Imagem em branco após plt.show(): salve antes de exibir

Em muitos scripts, plt.show() pode fechar a figure ou removê-la do pyplot. Se você chamar plt.savefig() depois, o Matplotlib pode salvar uma nova figure vazia.

fig, ax = plt.subplots()
ax.plot([1, 2, 3], [1, 4, 9])
fig.savefig("chart.png", dpi=300, bbox_inches="tight")
plt.show()

🧠 Por que isso acontece

O Matplotlib não expande automaticamente o canvas da figura quando os rótulos extrapolam os eixos. Causas comuns incluem:

  • Expressões em estilo LaTeX que geram símbolos altos
  • Valores grandes de fontsize
  • Rótulos de ticks longos ou rotacionados
  • Grades de subplots muito apertadas

Exemplo:

matplotlib-savefig-label-clipping-example

import matplotlib.pyplot as plt
 
plt.figure()
plt.ylabel(r'$\ln\left(\frac{x_a-x_b}{x_a-x_c}\right)$')
plt.xlabel(r'$\ln\left(\frac{x_a-x_d}{x_a-x_e}\right)$', fontsize=50)
plt.title('Example with matplotlib 3.4.2\nLabel clipping example')
plt.show()

O ylabel é visível, mas o xlabel frequentemente será cortado na figura salva.


✅ 1. Melhor solução moderna (recomendada): use layout="constrained"

No Matplotlib atual, uma forma clara de ativar o layout recomendado é:

fig, ax = plt.subplots(layout="constrained")

Exemplo:

matplotlib-constrained-layout-example.png

fig, ax = plt.subplots(figsize=(7, 5), layout="constrained")
ax.set_xlabel("Very long bottom label that usually gets clipped", fontsize=16)
ax.set_ylabel("Tall math label:\n$\\frac{x_a - x_b}{x_c}$")
fig.savefig("figure.png")

✔ Vantagens

  • Moderno e estável
  • Funciona melhor que tight_layout()
  • Funciona bem com colorbars, legendas e subplots

⚠ Desvantagens

  • Um pouco mais lento em grades grandes de subplots

Se você está escrevendo código novo em Matplotlib, isso deve ser sua escolha padrão.


✅ 2. Ajustar margens manualmente com subplots_adjust

Ainda é um método simples e eficaz:

plt.subplots_adjust(bottom=0.15)

Ou diretamente na figura:

plt.gcf().subplots_adjust(bottom=0.18)

Aumente o valor da margem até que os rótulos parem de se sobrepor ou serem cortados.

matplotlib-subplots-adjust-margins.png


✅ 3. Usar tight_layout() (mais antigo, mas ainda útil)

tight_layout() ajusta o espaçamento automaticamente:

fig, axes = plt.subplots(ncols=2, nrows=2, figsize=(8, 6))
for ax in axes.flatten():
    ax.set_xlabel("Example X label")
    ax.set_ylabel("Example Y label")
 
plt.tight_layout()
plt.show()

Observações

  • Bom para gráficos simples
  • Pode ter problemas com legendas e colorbars
  • layout="constrained" agora é a solução preferida

✅ 4. Salvar com bbox_inches="tight" (ótimo conserto rápido)

Uma solução bastante usada para cortes:

plt.savefig("myfile.png", bbox_inches="tight")

Quando usar

  • Correção rápida sem modificar o layout
  • Garante que tudo o que aparece na tela também apareça no arquivo

matplotlib-tight-layout-subplots.png


✅ 5. Ativar layout automático com rcParams

Se você quiser uma solução permanente aplicada a todos os gráficos: matplotlib-bbox-inches-tight-example.png

Atualizar rcParams em tempo de execução:

from matplotlib import rcParams
rcParams.update({"figure.autolayout": True})

OU configurar o matplotlibrc:

figure.autolayout : True

Isso ajuda a garantir saídas consistentes entre diferentes máquinas.


📌 Tabela resumo: qual método devo usar?

MétodoQuando usarMelhor para
layout="constrained"Escolha padrãoLayout moderno, subplots, legendas
bbox_inches='tight'Correção rápida ao salvarExportar gráficos individuais
tight_layout()Código legadoGrades simples de subplots
subplots_adjust()Você quer controle totalmente manualAjuste fino para publicações
figure.autolayout=TruePadrão em nível de projetoConsistência entre sistemas

💡 Dicas extras para figuras perfeitas

✔ Use DPI mais alto para reduzir problemas com rótulos longos

plt.savefig("fig.png", dpi=200, bbox_inches="tight")

✔ Evite tamanhos de fonte enormes, a menos que sejam realmente necessários

Fontes muito grandes aumentam a chance de corte.

✔ Para colorbars: use constrained_layout

Ele costuma funcionar significativamente melhor que tight_layout.


📊 Crie visualizações sem ajustar layout manualmente (PyGWalker)

Se você usa Matplotlib principalmente para visualizar DataFrames, talvez nem precise ajustar layouts manualmente.

Você pode simplesmente:

  • Carregar seu DataFrame
  • Arrastar e soltar campos
  • Gerar gráficos instantaneamente

Usando o PyGWalker, uma ferramenta de visualização open-source:

PyGWalker for Data visualization (opens in a new tab)

Veja como usar:

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

Ou experimente online:

KaggleGoogle ColabGitHub

Perguntas frequentes

  1. Como evitar rótulos cortados com plt.savefig? Use bbox_inches='tight', por exemplo plt.savefig("plot.png", dpi=300, bbox_inches="tight"). Para código novo, crie a figura com layout="constrained".

  2. O que bbox_inches="tight" faz? Ele recalcula a área salva para incluir rótulos, títulos, legendas e anotações que ficariam fora dos eixos.

  3. Quando usar layout="constrained" em vez de bbox_inches='tight'? Use layout="constrained" ao criar figuras novas com subplots, colorbars ou legendas. Use bbox_inches='tight' como correção rápida na exportação.

  4. Por que a imagem fica em branco depois de plt.show()? Alguns backends fecham a figure depois de plt.show(). Chame fig.savefig(...) ou plt.savefig(...) antes de plt.show().

  5. Qual DPI usar com savefig? 150 DPI costuma bastar para web e apresentações; 300 DPI é melhor para relatórios e impressão. Para saída vetorial, use SVG ou PDF.

Guias relacionados