HOWTO · Matplotlib

Como posicionar a legenda fora do gráfico no Matplotlib

Aprenda a posicionar uma legenda do Matplotlib fora dos eixos e mantê-la visível nas figuras salvas.

Nesta página

Use bbox_to_anchor com loc para posicionar uma legenda do Matplotlib fora dos eixos. Por exemplo, ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1)) fixa o canto superior esquerdo da legenda logo além da borda superior direita dos eixos. No sistema de coordenadas padrão dos eixos, (0, 0) corresponde ao canto inferior esquerdo e (1, 1), ao canto superior direito.

Exemplo de bbox_to_anchor

Use um par de valores em bbox_to_anchor para posicionar a legenda logo além dos eixos. Em Axes.legend, esse par representa um ponto de ancoragem nas coordenadas dos eixos; loc alinha o canto correspondente da legenda a esse ponto. O exemplo completo a seguir desenha duas curvas identificadas e reserva espaço na figura para a legenda.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))
fig.subplots_adjust(right=0.78)
plt.close(fig)

Exemplo de legenda do Matplotlib com bbox_to_anchor

Para ajustar melhor a posição, bbox_to_anchor também aceita (x0, y0, width, height). Essa tupla define uma caixa de ancoragem, e não as dimensões da legenda: (x0, y0) é o canto inferior esquerdo da caixa, enquanto width e height definem seu tamanho nas coordenadas dos eixos. loc escolhe o ponto da legenda que será alinhado ao ponto correspondente dessa caixa. Por exemplo, loc="upper left" alinha o canto superior esquerdo da legenda ao canto superior esquerdo da caixa. Entre os valores de texto mais comuns estão "upper right", "lower left", "center" e "best"; o Matplotlib também aceita os códigos numéricos correspondentes, de 0 para "best" a 10 para "center".

tight_layout() ajusta os parâmetros dos subplots para abrir espaço para elementos dos eixos, como rótulos e títulos. Ele não reserva espaço de forma confiável para uma legenda externa em todos os layouts. Para manter a legenda visível na janela, reserve espaço com fig.subplots_adjust(right=...) ou escolha um layout que comporte os eixos e a legenda. A primeira imagem mostra uma legenda posicionada fora dos eixos; a imagem do resultado cortado ilustra o que pode acontecer quando a figura não tem espaço para ela.

Legenda do Matplotlib com bbox_to_anchor cortada

bbox_extra_artists e bbox_inches para evitar o corte da legenda

Ao salvar uma figura, passe a legenda externa em bbox_extra_artists e defina bbox_inches="tight". Assim, a operação de salvamento considera a legenda ao calcular a caixa delimitadora ajustada da figura, incluindo-a na imagem exportada. Este exemplo foi concluído com sucesso e grava o PNG em um diretório temporário. Ele não produz saída padrão nem saída de erro.

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import numpy as np
from pathlib import Path
from tempfile import TemporaryDirectory

x = np.linspace(0, 10, 100)
fig, ax = plt.subplots()
ax.plot(x, np.sin(x), label="sin(x)")
ax.plot(x, np.cos(x), label="cos(x)")
legend = ax.legend(loc="upper left", bbox_to_anchor=(1.02, 1))

with TemporaryDirectory() as directory:
    output_path = Path(directory) / "example.png"
    fig.savefig(
        output_path,
        dpi=300,
        format="png",
        bbox_extra_artists=(legend,),
        bbox_inches="tight",
    )

plt.close(fig)

bbox_extra_artists recebe os elementos gráficos que o Matplotlib deve incluir ao calcular a caixa delimitadora ajustada. bbox_inches="tight" instrui savefig a usar essa caixa calculada na imagem salva. Essas opções evitam cortes durante a exportação; elas não redimensionam nem reposicionam a legenda dentro dos eixos.

O exemplo de salvamento foi concluído com código de saída 0; tanto a saída padrão quanto a saída de erro estão vazias, portanto não há saída visível a apresentar.