Legenda Fora do Gráfico no Matplotlib: bbox_to_anchor
Publicado em
Atualizado em

A legenda padrão fica dentro dos eixos e muitas vezes cobre os dados. Para estacioná-la fora, combine loc (qual canto da caixa da legenda é a âncora) com bbox_to_anchor (onde essa âncora fica nas coordenadas dos eixos).
Correção rápida
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 200)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
# Outside, upper-right of the axes
ax.legend(bbox_to_anchor=(1.02, 1), loc="upper left", borderaxespad=0)
plt.tight_layout()
plt.show()| Posição | Chamada típica |
|---|---|
| À direita dos eixos | legend(bbox_to_anchor=(1.02, 1), loc="upper left") |
| À direita, centrada na vertical | legend(loc="center left", bbox_to_anchor=(1.02, 0.5)) |
| Abaixo, horizontal | legend(loc="upper center", bbox_to_anchor=(0.5, -0.12), ncol=n) |
| Acima | legend(loc="lower center", bbox_to_anchor=(0.5, 1.02), ncol=n) |
| Exportar sem cortar | savefig(..., bbox_inches="tight") ou tight_layout() / constrained_layout=True |
Coordenadas dos eixos: (0, 0) é o canto inferior esquerdo dos eixos, (1, 1) é o superior direito. Valores um pouco acima de 1 ou abaixo de 0 ficam logo fora da moldura do gráfico.
- Runcell Science: alternativa open source ao Claude Science para pesquisa com IA
- Como impedir o Mac de dormir: mantenha Codex, Claude Code e agentes de IA rodando
- OpenClaw vs ZeroClaw vs Pi Agent vs Nanobot: qual stack de agentes de IA você deve escolher em 2026?
- Como o Claude Code analisa notebooks Jupyter em Data Science: capacidade real, limites e alternativa melhor
- Claude Code Routines: rotinas e cron jobs para agentes de IA
- Claude Code Desktop: como ativar Bypass permissions
- Como Construir Dois Agentes Python com o Protocolo A2A do Google - Tutorial Passo a Passo
- Top 10 bibliotecas de visualização de dados em Python em 2025
O problema: legenda em cima dos dados
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(x, np.sin(x), label="sin(x)", lw=2)
ax.plot(x, np.cos(x), label="cos(x)", lw=2)
ax.legend(loc="best") # still inside the axes
ax.set_title("Default legend (often overlaps data)")
plt.show()
loc="best" só escolhe o canto interno menos pior. Nunca move a legenda para a margem da figura.
Como bbox_to_anchor + loc trabalham juntos
bbox_to_anchor=(x, y)— ponto em coordenadas fracionárias dos eixos (por padrão).loc="upper left"(etc.) — qual ponto da caixa da legenda fica preso nessa âncora.borderaxespad— espaçamento entre os eixos e a legenda; use0quando quiser encaixe justo por fora.
Modelo mental: ponto âncora no gráfico + qual canto da legenda senta nesse ponto.
Colocar a legenda à direita
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(x, np.sin(x), label="sin(x)", lw=2)
ax.plot(x, np.cos(x), label="cos(x)", lw=2)
ax.legend(bbox_to_anchor=(1.02, 1), loc="upper left", borderaxespad=0)
ax.set_title("Legend outside: upper right of axes")
fig.tight_layout()
plt.show()
Se a janela ainda cortar a legenda, chame tight_layout() / use constrained_layout=True em subplots, ou reserve espaço encolhendo os eixos (próxima seção).
Encolher os eixos e encaixar a legenda
Com muitas séries, deixe uma coluna dedicada à legenda:
x = np.arange(10)
fig = plt.figure(figsize=(7.2, 4.2))
ax = fig.add_subplot(111)
for i in range(5):
ax.plot(x, i * x, label=f"y = {i}x", lw=2)
# Leave ~22% of the figure width for the legend
box = ax.get_position()
ax.set_position([box.x0, box.y0, box.width * 0.78, box.height])
ax.legend(loc="center left", bbox_to_anchor=(1.02, 0.5), borderaxespad=0)
ax.set_title("Shrink axes, legend to the right")
plt.show()
Alternativa moderna: criar a figura com engines de layout que cooperam melhor com artistas fora dos eixos:
fig, ax = plt.subplots(layout="constrained")
# ... plot ...
ax.legend(bbox_to_anchor=(1.02, 1), loc="upper left")Legenda abaixo do gráfico (horizontal)
Use ncol para as entradas ficarem em uma linha sob o gráfico — bom para slides e dashboards largos:
x = np.arange(10)
fig = plt.figure(figsize=(7.2, 4.4))
ax = fig.add_subplot(111)
for i in range(5):
ax.plot(x, i * x, label=f"y = {i}x", lw=2)
box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.12, box.width, box.height * 0.88])
ax.legend(loc="upper center", bbox_to_anchor=(0.5, -0.12), ncol=5)
ax.set_title("Horizontal legend below the plot")
plt.show()
Guia de decisão
| Situação | Prefira |
|---|---|
| 2–4 séries, gráfico de linha simples | bbox_to_anchor=(1.02, 1), loc="upper left" + tight_layout() |
| Muitas séries, layout estável | Encolher eixos / layout="constrained" + legenda à direita |
| Figura larga / apresentação | Legenda embaixo com ncol |
| Mapa ou imagem em que qualquer caixa atrapalha | Legenda interna semitransparente: framealpha=0.3 (meio-termo) |
| Salvar PNG/PDF para artigos | Sempre teste bbox_inches="tight" (abaixo) |
Armadilha na exportação: legenda fora some no arquivo
A janela interativa pode mostrar a legenda enquanto o savefig a corta. A correção usual:
fig, ax = plt.subplots(figsize=(7, 4))
ax.plot(x, np.sin(x), label="sin(x)", lw=2)
ax.plot(x, np.cos(x), label="cos(x)", lw=2)
ax.legend(bbox_to_anchor=(1.02, 1), loc="upper left", borderaxespad=0)
ax.set_title("Outside legend kept with bbox_inches='tight'")
fig.savefig("legend-outside.png", dpi=150, bbox_inches="tight", facecolor="white")
Aprofundamento relacionado: savefig corta rótulos. Se os rótulos ainda colidirem, aumente o tamanho da figura antes de microajustar âncoras.
Controles extras (sem mover a caixa)
ax.legend(
bbox_to_anchor=(1.02, 1),
loc="upper left",
borderaxespad=0,
frameon=True,
fancybox=False,
framealpha=0.95,
fontsize=9, # or prop={"size": 9}
title="Series",
alignment="left",
)ncol— legenda em várias colunasframealpha— transparência quando a legenda precisa ficar sobre os dadostitle— rótulo de grupo em gráficos multi-série
Para estilo geral de legenda (não só posição), veja legenda no Matplotlib.
Armadilhas comuns
| Armadilha | O que você vê | Correção |
|---|---|---|
Só definir loc="right" | Legenda ainda dentro | Precisa de bbox_to_anchor além de 1.0 |
| Legenda fora na GUI, sumida no PNG | Export cortado | bbox_inches="tight" ou layout constrained |
bbox_to_anchor em coords de dados por engano | Legenda some do lugar | O padrão é coords dos eixos; passe uma 2-tupla, não um Bbox, salvo se for intencional |
| Fonte da legenda enorme | Domina a figura | fontsize=8–10, ou menos colunas |
| Sobreposição com colorbar | Margem espremida | Reserve espaço para os dois, ou coloque a legenda embaixo |
FAQ
Conclusão
Legenda fora é um problema de layout, não de API misteriosa: prenda um canto da legenda com loc, posicione esse pino com bbox_to_anchor logo além dos eixos (> 1 ou < 0) e garanta que a exportação use layout tight/constrained para a margem sobreviver no arquivo. Use pilha à direita para muitas séries e uma linha com ncol embaixo para figuras largas.
Guias relacionados
- Legenda no Matplotlib — estilo, títulos e padrões multi-legenda
- savefig corta rótulos no Matplotlib — checklist de corte na exportação
- Tamanho de figura no Matplotlib — dar espaço à legenda antes de afinar âncoras
- Matplotlib fill_between — séries sombreadas que precisam de legendas claras
- Múltiplos gráficos de linha no Matplotlib — multi-série que dispara esse problema
- Anotações e texto no Matplotlib — rótulos quando a legenda não basta
- Subplots no Matplotlib — legendas compartilhadas entre painéis