Skip to content
Tópicos
Matplotlib
Matplotlib Legend Outside the Plot: bbox_to_anchor Cheatsheet

Legenda Fora do Gráfico no Matplotlib: bbox_to_anchor

Publicado em

Atualizado em

Coloque a legenda fora dos eixos no Matplotlib com bbox_to_anchor e loc. À direita, à esquerda ou abaixo do gráfico, redimensione os eixos e exporte com bbox_inches='tight' sem cortar.

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çãoChamada típica
À direita dos eixoslegend(bbox_to_anchor=(1.02, 1), loc="upper left")
À direita, centrada na verticallegend(loc="center left", bbox_to_anchor=(1.02, 0.5))
Abaixo, horizontallegend(loc="upper center", bbox_to_anchor=(0.5, -0.12), ncol=n)
Acimalegend(loc="lower center", bbox_to_anchor=(0.5, 1.02), ncol=n)
Exportar sem cortarsavefig(..., 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.

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()

Default Matplotlib legend inside the axes

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

  1. bbox_to_anchor=(x, y) — ponto em coordenadas fracionárias dos eixos (por padrão).
  2. loc="upper left" (etc.) — qual ponto da caixa da legenda fica preso nessa âncora.
  3. borderaxespad — espaçamento entre os eixos e a legenda; use 0 quando 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()

Legend placed outside to the right of the axes

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()

Axes shrunk with legend docked on the right

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()

Horizontal legend placed below the plot

Guia de decisão

SituaçãoPrefira
2–4 séries, gráfico de linha simplesbbox_to_anchor=(1.02, 1), loc="upper left" + tight_layout()
Muitas séries, layout estávelEncolher eixos / layout="constrained" + legenda à direita
Figura larga / apresentaçãoLegenda embaixo com ncol
Mapa ou imagem em que qualquer caixa atrapalhaLegenda interna semitransparente: framealpha=0.3 (meio-termo)
Salvar PNG/PDF para artigosSempre 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")

Saved figure that keeps the outside legend via bbox_inches tight

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 colunas
  • framealpha — transparência quando a legenda precisa ficar sobre os dados
  • title — 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

ArmadilhaO que você vêCorreção
Só definir loc="right"Legenda ainda dentroPrecisa de bbox_to_anchor além de 1.0
Legenda fora na GUI, sumida no PNGExport cortadobbox_inches="tight" ou layout constrained
bbox_to_anchor em coords de dados por enganoLegenda some do lugarO padrão é coords dos eixos; passe uma 2-tupla, não um Bbox, salvo se for intencional
Fonte da legenda enormeDomina a figurafontsize=8–10, ou menos colunas
Sobreposição com colorbarMargem espremidaReserve 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