Skip to content

Posicionando a Legenda Fora do Gráfico no Matplotlib

Updated on

Gerenciar o posicionamento de legendas em visualizações de dados pode às vezes ser uma tarefa desafiadora. Hoje, iremos enfrentar esse problema de frente, demonstrando como posicionar efetivamente uma legenda fora de um gráfico usando a popular biblioteca de visualização de dados, Matplotlib. Vamos mergulhar e garantir que suas legendas nunca mais interfiram nos seus dados!

Entendendo o Problema

A legenda de um gráfico, apesar de ser um elemento vital para a interpretação dos dados, às vezes ocupa espaço valioso do gráfico, levando a gráficos lotados e menos legíveis. Uma solução popular para esse problema é mover a legenda para fora da área do gráfico.

A Solução do Matplotlib

O Matplotlib, uma biblioteca robusta e versátil de Python para visualização de dados, oferece uma solução direta para posicionar a legenda fora do gráfico.

Para ilustrar o conceito, primeiro criaremos um gráfico de linha simples usando a API pyplot do Matplotlib:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.linspace(0, 10, 100)
 
plt.plot(x, np.sin(x), label='sen(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend()
plt.show()

No código acima, temos dois gráficos de linha representando sen(x) e cos(x). A chamada da função legend() adiciona uma legenda ao gráfico dentro da área do gráfico, ocultando partes dos dados.

Posicionando a Legenda Fora do Gráfico

Para mover a legenda para fora do gráfico, podemos usar o parâmetro bbox_to_anchor da função legend(). Esse parâmetro nos permite especificar a posição da caixa delimitadora da legenda em relação aos eixos do gráfico.

Aqui está um exemplo que coloca a legenda à direita do gráfico:

plt.plot(x, np.sin(x), label='sen(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left')
plt.show()

Neste código, bbox_to_anchor=(1.05, 1) posiciona a caixa delimitadora da legenda logo fora dos eixos no canto superior esquerdo. loc='upper left' especifica o ponto na caixa da legenda que deve ser colocado nas coordenadas fornecidas em bbox_to_anchor.

Ajustando a Legenda

Além de posicionamento básico, podemos fazer várias alterações na legenda para que ela se adapte melhor às nossas necessidades.

Reduzindo o Tamanho da Fonte

Para reduzir o tamanho da fonte do texto da legenda:

plt.plot(x, np.sin(x), label='sen(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', prop={'size': 6})
plt.show()

Neste código, prop={'size': 6} reduz o tamanho da fonte do texto da legenda, tornando a caixa da legenda menor no geral.

Alterando a Orientação da Legenda

Se você deseja uma legenda horizontal, use o parâmetro ncol para especificar o número de colunas:

plt.plot(x, np.sin(x), label='sen(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend(bbox_to_anchor=(0.5, -0.15), loc='upper center', ncol=2)
plt.show()

Assumindo o Controle do Posicionamento da Legenda no Matplotlib

Uma das tarefas recorrentes em visualização de dados com Python é criar gráficos claros, concisos e atraentes. Uma parte crucial para alcançar isso envolve organizar adequadamente a legenda fora do gráfico no Matplotlib. Este guia abrangente o guiará por vários métodos para realizar exatamente isso.

Bbox_to_anchor: Seu Bilhete para um Melhor Posicionamento da Legenda

Existem várias abordagens para posicionar sua legenda fora da caixa do gráfico Matplotlib. Um dos métodos mais flexíveis e eficientes envolve o uso do argumento de palavra-chave bbox_to_anchor. Vamos mergulhar mais fundo e descobrir como você pode utilizar esse recurso poderoso para melhorar a estética do seu gráfico.

Para uma aplicação básica do bbox_to_anchor, considere o exemplo a seguir, onde a legenda é deslocada ligeiramente para fora dos limites dos eixos:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.arange(10)
 
fig = plt.figure()
ax = plt.subplot(111)
 
for i in range(5):
    ax.plot(x, i * x, label='$y = %ix$' % i)
 
ax.legend(bbox_to_anchor=(1.1, 1.05))
 
plt.show()

No trecho de código acima, a legenda é estrategicamente posicionada ligeiramente à direita e acima do canto superior direito dos limites dos eixos, garantindo assim que ela não obstrua o gráfico enquanto permanece facilmente visível.

Desbloqueando o Poder de Shrink: Outro Segredo para um Posicionamento Ótimo da Legenda

Em cenários onde você deseja mover a legenda ainda mais para fora do gráfico, você pode considerar a redução das dimensões do gráfico atual. Vamos ver um exemplo de código:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.arange(10)
 
fig = plt.figure()
ax = plt.subplot(111)
 
for i in range(5):
    ax.plot(x, i * x, label='$y = %ix$'%i)
 
# Reduzir o tamanho do eixo atual em 20%
caixa = ax.get_position()
ax.set_position([caixa.x0, caixa.y0, caixa.width * 0.8, caixa.height])
 
# Colocar a legenda à direita do eixo atual
ax.legend(loc='center left', bbox_to_anchor=(1, 0.5))
 
plt.show()

Essa abordagem nos permite dedicar uma parte do espaço de plotagem para acomodar confortavelmente a legenda. Observe como usamos ax.get_position() para obter a posição atual dos eixos, em seguida, ajustamos conforme necessário antes de reposicionar a legenda.

Colocando a Legenda na Parte Inferior do Gráfico

Se a colocação da legenda à direita do gráfico não for adequada, há também a opção de posicioná-la abaixo do gráfico. A seguir está um exemplo:

import matplotlib.pyplot as plt
import numpy as np
 
x = np.arange(10)
 
fig = plt.figure()
ax = plt.subplot(111)
 
for i in range(5):
    linha, = ax.plot(x, i * x, label='$y = %ix$'%i)
 
# Reduzir a altura do eixo atual em 10% na parte inferior
caixa = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1,
                 box.width, box.height * 0.9])
 
# Coloque uma legenda abaixo do eixo atual
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
          fancybox=True, shadow=True, ncol=5)
 
plt.show()

Esta abordagem ajuda a utilizar o espaço disponível de forma eficaz, sem obstruir a visão do gráfico.

A Lenda das Lendas: Guia de Legendas do Matplotlib

Como cientista de dados aspirante ou profissional experiente, saber como controlar a posição da legenda em seus gráficos com Matplotlib é uma habilidade essencial. Agora que já cobrimos vários métodos para posicionar a legenda fora do gráfico, vamos mergulhar em algumas customizações avançadas.

Aprimorando o Estilo da Legenda

Às vezes, queremos tornar nossa legenda ainda mais legível e esteticamente agradável. Os parâmetros fancybox, shadow e borderpad permitem uma variedade de opções de estilo:

ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05), 
          fancybox=True, shadow=True, borderpad=1.5, ncol=5)

Neste exemplo, fancybox=True dá à caixa da legenda cantos arredondados, shadow=True adiciona um efeito de sombra e borderpad=1.5 aumenta o preenchimento dentro da caixa.

Ordenando as Entradas da Legenda

Em alguns casos, você pode querer alterar a ordem das entradas em sua legenda. A classe HandlerLine2D do Matplotlib pode ajudá-lo a fazer isso. Aqui está uma ilustração simples:

from matplotlib.lines import Line2D
 
fig, ax = plt.subplots()
lines = []
labels = []
 
for i in range(5):
    line, = ax.plot(x, i * x, label='$y = %ix$' % i)
    lines.append(line)
    labels.append('$y = %ix$' % i)
 
# Reordene os rótulos e as alças das linhas
lines = [lines[i] for i in [4, 2, 0, 1, 3]]
labels = [labels[i] for i in [4, 2, 0, 1, 3]]
 
# Cria uma legenda para a primeira linha
first_legend = plt.legend(lines[:2], labels[:2], loc='upper left')
 
# Adiciona a legenda manualmente aos Eixos atuais
ax.add_artist(first_legend)
 
# Cria outra legenda para o resto.
plt.legend(lines[2:], labels[2:], loc='lower right')
 
plt.show()

Neste cenário, primeiro plotamos as linhas, armazenamos suas alças e rótulos e depois as reordenamos conforme nossa preferência.

Alternativa ao Matplotlib: Visualize Dados com o PyGWalker

Além de usar o Matplotlib para visualizar seus dados do pandas, aqui está uma biblioteca alternativa em Python de código aberto que pode ajudá-lo a criar visualizações de dados com facilidade: PyGWalker (opens in a new tab).

PyGWalker para visualização de dados (opens in a new tab)

Não há necessidade de realizar processamentos complicados com programação Python, basta importar seus dados e arrastar e soltar variáveis para criar todos os tipos de visualizações de dados! Aqui está um vídeo demonstrativo rápido sobre a operação:


Veja como usar o PyGWalker em seu Jupyter Notebook:

pip install pygwalker
import pygwalker as pyg
gwalker = pyg.walk(df)

Alternativamente, você pode experimentá-lo no Kaggle Notebook / Google Colab:

Executar PyGWalker em Kaggle Notebook (opens in a new tab)Executar PyGWalker no Google Colab (opens in a new tab)Dê uma ⭐️ para o PyGWalker no GitHub (opens in a new tab)
Executar PyGWalker em Kaggle Notebook (opens in a new tab)Executar PyGWalker no Google Colab (opens in a new tab)Executar PyGWalker no Google Colab (opens in a new tab)

O PyGWalker é construído com o apoio da nossa comunidade de código aberto. Não se esqueça de conferir o PyGWalker GitHub (opens in a new tab) e nos dar uma estrela!

Conclusão

Compreender as várias opções de personalização da legenda do Matplotlib é fundamental para criar gráficos de nível profissional. Portanto, pratique essas técnicas e explore a documentação do Matplotlib para se familiarizar com essa ferramenta essencial para visualização de dados.

Perguntas Frequentes

A seguir, abordaremos algumas perguntas frequentes sobre a colocação de legendas no Matplotlib.

P1: Posso colocar uma legenda do Matplotlib fora da área do gráfico sem redimensionar o próprio gráfico?

Sim, você pode colocar a legenda fora do gráfico sem redimensionar o gráfico. No entanto, a legenda pode não ser visível na figura salva porque a opção bbox_inches='tight' em plt.savefig() pode não considerar os elementos fora dos limites dos eixos.

P2: Existe uma maneira de determinar automaticamente a melhor localização para a legenda?

Sim, o Matplotlib fornece uma maneira de determinar automaticamente a melhor localização para a legenda passando loc='best' na função legend(). Essa opção coloca a legenda na localização que minimiza a sobreposição com o gráfico.

P3: Como posso tornar os rótulos da legenda mais legíveis se eles estiverem sobrepostos ao gráfico?

Você pode aumentar a legibilidade dos rótulos da legenda usando um fundo de legenda semi-transparente. Isso pode ser alcançado definindo o parâmetro framealpha em legend(). Por exemplo, ax.legend(framealpha=0.5) define o fundo da legenda como semi-transparente.