HOWTO · Matplotlib

Especificar a Posição da Legenda em Coordenadas Gráficas em Matplotlib

Este artigo mostra-lhe como especificar a posição da legenda num gráfico em Matplotlib.

Nesta página

Para posicionar uma legenda do Matplotlib, defina o parâmetro loc com uma posição padrão, como "upper left" ou "lower right". Para colocá-la numa coordenada específica, combine loc com bbox_to_anchor: bbox_to_anchor fornece a coordenada de ancoragem, e loc seleciona o ponto da legenda que será alinhado a ela. O borderaxespad padrão do Matplotlib acrescenta um pequeno espaço, por isso o ponto visível da legenda pode ficar ligeiramente afastado da coordenada; defina borderaxespad=0 quando precisar de um alinhamento exato.

Exemplos: posicionar uma legenda do Matplotlib com loc e bbox_to_anchor

O exemplo seguinte cria dois eixos e adiciona uma legenda a cada um. No primeiro eixo, usa best; no segundo, usa lower left. Pode alterar estes valores para comparar posições padrão com os seus próprios dados. As figuras mostram os gráficos resultantes; o código indica quais as definições que pode adaptar.

import matplotlib.pyplot as plt

x = [1, 2, 3]
y1 = [0.5 * i + 1 for i in x]
y2 = [2 * i + 1 for i in x]

fig, ax = plt.subplots(2, 1)

ax[0].plot(x, y1, "b-", label="0.5x+1")
ax[0].plot(x, y2, "g-", label="2x+1")
ax[0].legend(loc="best")

ax[1].plot(x, y1, "b-", label="0.5x+1")
ax[1].plot(x, y2, "g-", label="2x+1")
ax[1].legend(loc="lower left")

plt.tight_layout()
plt.show()

Specify Legend position in graph coordinates Matplotlib

O parâmetro loc aceita valores como best, upper right, upper left, lower left, lower right, right, center left, center right, lower center, upper center e center:

best
upper right
upper left
lower left
lower right
right
center left
center right
lower center
upper center
center

Numa posição padrão, loc posiciona a legenda dentro dos respetivos eixos. Com o valor best, o Matplotlib escolhe uma posição com base no conteúdo do gráfico; valores como lower left permitem escolher a posição diretamente. Se a legenda cobrir uma linha ou um marcador importante, experimente outro valor da lista. Estas opções definem a posição da legenda em relação aos seus eixos, e não uma posição partilhada pela figura inteira.

Para posicionar a legenda por coordenadas, bbox_to_anchor fornece a coordenada de ancoragem e loc seleciona o ponto da legenda que será alinhado a ela. No exemplo seguinte, cada âncora é definida em coordenadas relativas aos respetivos eixos. O marcador vermelho é desenhado nessa mesma coordenada com ax.transAxes, o que facilita a identificação da âncora. Os dois eixos usam valores diferentes de loc para mostrar como muda o ponto selecionado da legenda. Com o borderaxespad padrão, a legenda fica ligeiramente afastada de cada marcador; o marcador continua a indicar a coordenada de ancoragem.

import matplotlib.pyplot as plt

x = [1, 2, 3]
y1 = [0.5 * i + 1 for i in x]
y2 = [2 * i + 1 for i in x]

fig, ax = plt.subplots(2, 1)

ax[0].plot(x, y1, "b-", label="Plot-1")
ax[0].plot(x, y2, "g-", label="Plot-2")
ax[0].legend(loc="upper left", bbox_to_anchor=(0.9, 0.75))
ax[0].scatter((0.9), (0.75), s=70, c="red", transform=ax[0].transAxes)

ax[1].plot(x, y1, "b-", label="Plot-1")
ax[1].plot(x, y2, "g-", label="Plot-2")
ax[1].legend(loc="center right", bbox_to_anchor=(0.6, 0.4))
ax[1].scatter((0.6), (0.4), s=70, c="red", transform=ax[1].transAxes)

plt.tight_layout()
plt.show()

Set bbox_to_anchor to specify Legend position in graph coordinates Matplotlib

No eixo superior, bbox_to_anchor=(0.9, 0.75) coloca a âncora no marcador vermelho. Como loc="upper left", o canto superior esquerdo da legenda fica alinhado com essa âncora, com um pequeno espaço visível devido ao borderaxespad padrão. No eixo inferior, a âncora é (0.6, 0.4) e loc="center right"; assim, o centro do lado direito da legenda fica alinhado com o marcador vermelho inferior, com o mesmo efeito de espaçamento. Para fazer coincidir exatamente qualquer um dos pontos selecionados com o respetivo marcador, adicione borderaxespad=0 à chamada legend desse eixo.

Para adaptar qualquer uma das posições, comece por escolher uma coordenada x e y relativa ao eixo pretendido. Em seguida, defina a tupla correspondente em bbox_to_anchor e marque esse ponto enquanto ajusta o gráfico. Selecione um valor de loc para o ponto da legenda que pretende alinhar com a âncora. As duas definições funcionam em conjunto: alterar apenas a âncora desloca o ponto selecionado; alterar loc muda o ponto da legenda que se alinha com a âncora. Mantenha a transformação de cada marcador associada ao mesmo eixo da respetiva legenda, para que a referência visual use o mesmo espaço de coordenadas. Mantenha o borderaxespad padrão para deixar um pequeno espaço ou defina borderaxespad=0 na chamada da legenda para alinhar exatamente com o marcador. Não é apresentada qualquer saída na consola; as figuras acima mostram os gráficos resultantes.