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

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,
)| Problema | Tente primeiro |
|---|---|
| Rótulos, título ou legenda cortados | bbox_inches="tight" |
| Código novo em Matplotlib | plt.subplots(layout="constrained") |
| Imagem salva em branco | Chamar savefig() antes de plt.show() |
| Margem demais ao redor | bbox_inches="tight", pad_inches=0 |
| Saída em alta resolução | dpi=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:

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:

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.

✅ 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

✅ 5. Ativar layout automático com rcParams
Se você quiser uma solução permanente aplicada a todos os gráficos:

Atualizar rcParams em tempo de execução:
from matplotlib import rcParams
rcParams.update({"figure.autolayout": True})OU configurar o matplotlibrc:
figure.autolayout : TrueIsso ajuda a garantir saídas consistentes entre diferentes máquinas.
📌 Tabela resumo: qual método devo usar?
| Método | Quando usar | Melhor para |
|---|---|---|
layout="constrained" | Escolha padrão | Layout moderno, subplots, legendas |
bbox_inches='tight' | Correção rápida ao salvar | Exportar gráficos individuais |
tight_layout() | Código legado | Grades simples de subplots |
subplots_adjust() | Você quer controle totalmente manual | Ajuste fino para publicações |
figure.autolayout=True | Padrão em nível de projeto | Consistê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:
Veja como usar:
pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)Ou experimente online:
| Kaggle | Google Colab | GitHub |
|---|---|---|
![]() | ![]() | ![]() |
Perguntas frequentes
-
Como evitar rótulos cortados com
plt.savefig? Usebbox_inches='tight', por exemploplt.savefig("plot.png", dpi=300, bbox_inches="tight"). Para código novo, crie a figura comlayout="constrained". -
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. -
Quando usar
layout="constrained"em vez debbox_inches='tight'? Uselayout="constrained"ao criar figuras novas com subplots, colorbars ou legendas. Usebbox_inches='tight'como correção rápida na exportação. -
Por que a imagem fica em branco depois de
plt.show()? Alguns backends fecham a figure depois deplt.show(). Chamefig.savefig(...)ouplt.savefig(...)antes deplt.show(). -
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
- Matplotlib Subplots -- exporte figuras com múltiplos painéis sem cortar rótulos.
- Matplotlib Figure Size -- controle polegadas, pixels e DPI.
- Matplotlib Histogram -- salve histogramas com títulos e rótulos completos.
- Seaborn Heatmap -- exporte heatmaps com anotações e colorbar.



