Posicionando a Legenda Fora do Gráfico no Matplotlib
Published 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).
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:
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.