HOWTO · Matplotlib
Como criar uma única legenda para todos os subquadros em Matplotlib
Use `fig.legend()` para criar uma legenda no nível da figura inteira e `ax.legend()` para criar uma legenda de um Axes específico. Quando os subplots compartilham os mesmos rótulos, reutilize os itens de um deles; quando o conteúdo difere, reúna os itens de cada Axes.
Nesta página
Use fig.legend() para associar uma única legenda à figura inteira do Matplotlib. Quando todos os subplots exibem as mesmas séries identificadas, reutilize os objetos de referência e os rótulos de um Axes. Quando os subplots exibem séries diferentes, reúna os objetos de referência e os rótulos de cada Axes e passe as duas listas à legenda da figura. Isso difere de ax.legend(), que cria uma legenda para um único Axes.
Os exemplos abaixo usam Matplotlib para criar as figuras. O primeiro também exibe os rótulos reunidos para a legenda compartilhada.
Crie uma legenda compartilhada no nível da figura quando os subplots usam os mesmos rótulos
Se cada subplot plota as mesmas séries com os mesmos rótulos, um único subplot já fornece os itens necessários para uma legenda compartilhada. O exemplo abaixo usa duas medidas com escalas diferentes, ambas identificadas como measurement. Como o rótulo e o significado são iguais, basta obter os objetos de referência do primeiro Axes. Adicione a legenda a fig, em vez de chamar legend() em cada Axes, para exibi-la uma única vez na figura.
Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import matplotlib
matplotlib.use("Agg")
import logging
# Ignore only Matplotlib's benign cold-start cache notice; other diagnostics
# remain visible on stderr.
class _FontCacheNoticeFilter(logging.Filter):
def filter(self, record):
return "Matplotlib is building the font cache; this may take a moment." not in record.getMessage()
logging.getLogger("matplotlib.font_manager").addFilter(_FontCacheNoticeFilter())
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 1, figsize=(6, 4))
x = [0, 1, 2]
for ax, scale in zip(axes, [1, 2]):
ax.plot(x, [scale * value for value in x], label="measurement")
handles, labels = axes[0].get_legend_handles_labels()
fig.legend(handles, labels, loc="upper center")
fig.tight_layout(rect=(0, 0, 1, 0.9))
print("Legend entries:", labels)
plt.show()
Legend entries: ['measurement']
get_legend_handles_labels() retorna duas listas correspondentes para os elementos identificados naquele Axes. A abordagem com rótulos compartilhados é concisa, mas representa apenas as séries presentes no Axes escolhido. Se outro subplot tiver um rótulo ou uma série diferente, use a abordagem que reúne os dados de todos os Axes na próxima seção.
Reúna objetos de referência e rótulos de todos os Axes quando o conteúdo dos subplots for diferente
Quando subplots diferentes contêm linhas identificadas de formas distintas, reúna os objetos de referência e os rótulos de cada Axes no mesmo loop. As listas permanecem alinhadas por posição: o objeto de referência no índice i corresponde ao rótulo no índice i. O código abaixo produz dois itens na legenda, um para cada linha.
Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(7, 3))
axes[0].plot([0, 1, 2], [0, 1, 4], label="quadratic")
axes[1].plot([0, 1, 2], [0, 1, 2], label="linear")
handles, labels = [], []
for ax in axes:
ax_handles, ax_labels = ax.get_legend_handles_labels()
handles.extend(ax_handles)
labels.extend(ax_labels)
fig.legend(handles, labels, loc="upper center", ncol=2)
fig.tight_layout(rect=(0, 0, 1, 0.88))
plt.show()
Isso reúne os elementos identificados de todos os Axes; por isso, rótulos repetidos podem aparecer mais de uma vez. Se as entradas repetidas representam o mesmo conceito, selecione um objeto de referência para cada rótulo desejado antes de chamar fig.legend(). Por outro lado, mantenha rótulos diferentes quando os leitores precisarem distinguir as séries. Para exibir apenas alguns itens, passe somente os objetos de referência e os rótulos correspondentes; a legenda não precisa incluir todas as linhas plotadas.
Posicione e formate a legenda no nível da figura
O argumento loc escolhe qual ponto da legenda será alinhado à sua âncora. Por exemplo, fig.legend(..., loc="upper center") centraliza a legenda no topo da figura. Para controlar a âncora explicitamente, use bbox_to_anchor; em uma legenda da figura, as coordenadas são relativas à figura. Por exemplo, fig.legend(handles, labels, loc="upper center", bbox_to_anchor=(0.5, 1.02)) posiciona a legenda logo acima da borda superior. Ajuste os valores da âncora para movê-la e reserve espaço com fig.tight_layout(rect=(0, 0, 1, 0.9)) ou fig.subplots_adjust(top=0.82) para que ela não cubra o conteúdo dos subplots.
A formatação da legenda usa opções familiares também disponíveis para outras legendas do Matplotlib. Passe valores como fontsize=9, frameon=False ou facecolor="white" a fig.legend() para ajustar o tamanho do texto, a moldura ou o fundo. Ao salvar uma figura com uma legenda fora dos seus limites, fig.savefig("plot.png", bbox_inches="tight") pode incluir essa legenda na imagem salva.
Perguntas frequentes sobre uma legenda no nível da figura
Qual é a diferença entre ax.legend() e fig.legend()? ax.legend() pertence a um Axes específico. fig.legend() pertence à Figure e pode combinar itens fornecidos por um ou mais Axes.
Como criar uma legenda única quando todos os subplots usam os mesmos rótulos? Obtenha os objetos de referência e os rótulos de um Axes representativo e passe-os a fig.legend(). Isso funciona quando esse Axes tem as mesmas séries identificadas que os outros subplots.
Como incluir somente algumas linhas? Mantenha os objetos de referência e os rótulos desejados em listas correspondentes e passe essas listas a fig.legend(). Se houver rótulos repetidos, verifique se as entradas representam a mesma série antes de remover duplicatas.
Como evitar que a legenda cubra os gráficos? Posicione-a na margem da figura com loc e bbox_to_anchor e reserve espaço no layout dos subplots. Se a legenda ficar fora da área da figura, use uma caixa delimitadora ajustada ao salvar para evitar que ela seja cortada.