Matplotlib Legend: Guia completo para adicionar e personalizar legendas
Updated on
Um gráfico sem legenda força os leitores a adivinhar qual linha é qual. Eles combinam cores mentalmente, leem dados incorretamente e tiram conclusões erradas. Adicionar uma legenda com plt.legend() é simples -- mas controlar onde ela aparece, como ela se parece e impedir que cubra seus dados requer mais trabalho do que a maioria dos tutoriais mostra.
Este guia cobre tudo, desde a criação básica de legendas até a personalização avançada: posicionamento dentro e fora do gráfico, layouts multi-colunas, handles personalizados e legendas para figuras complexas.
Legenda básica
Labels automáticos
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x), label='sin(x)')
plt.plot(x, np.cos(x), label='cos(x)')
plt.legend()
plt.show()O parâmetro label em plot() define o que aparece na legenda. Chame plt.legend() para exibi-la.
Estilo orientado a objetos
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.legend()
plt.show()Posicionamento da legenda
Usando o parâmetro loc
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
# Localizações comuns
ax.legend(loc='upper right') # Padrão
# ax.legend(loc='upper left')
# ax.legend(loc='lower right')
# ax.legend(loc='lower left')
# ax.legend(loc='center')
# ax.legend(loc='best') # Escolhe automaticamente o local com menos sobreposição
plt.show()Todas as opções de loc
| String loc | Número loc |
|---|---|
'best' | 0 |
'upper right' | 1 |
'upper left' | 2 |
'lower left' | 3 |
'lower right' | 4 |
'right' | 5 |
'center left' | 6 |
'center right' | 7 |
'lower center' | 8 |
'upper center' | 9 |
'center' | 10 |
Posicionamento preciso com bbox_to_anchor
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.plot(x, np.sin(x) + np.cos(x), label='sin(x) + cos(x)')
# Posicionar legenda em coordenadas específicas (x, y) em fração de eixos
ax.legend(loc='upper left', bbox_to_anchor=(0.02, 0.98))
plt.show()Legenda fora do gráfico
Quando a legenda sobrepõe dados, mova-a para fora:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(10, 5))
for i in range(6):
ax.plot(x, np.sin(x + i * 0.5), label=f'Phase {i}')
# Colocar legenda à direita do gráfico
ax.legend(loc='center left', bbox_to_anchor=(1.0, 0.5))
plt.tight_layout()
plt.show()import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 6))
for i in range(5):
ax.plot(x, np.sin(x + i), label=f'Series {i+1}')
# Colocar legenda abaixo do gráfico
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1), ncol=5)
plt.tight_layout()
plt.show()Estilo da legenda
Tamanho da fonte e moldura
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, np.sin(x), label='sin(x)')
ax.plot(x, np.cos(x), label='cos(x)')
ax.legend(
fontsize=12,
frameon=True, # Mostrar borda (padrão True)
framealpha=0.8, # Transparência da borda
facecolor='lightyellow', # Cor de fundo
edgecolor='gray', # Cor da borda
shadow=True, # Sombra
)
plt.show()Layout multi-colunas
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(10, 5))
for i in range(8):
ax.plot(x, np.sin(x + i * 0.4), label=f'Signal {i+1}')
# 4 colunas para legenda compacta
ax.legend(ncol=4, loc='upper center', fontsize=9)
plt.show()Título da legenda
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0, 10, 100)
fig, ax = plt.subplots(figsize=(8, 5))
ax.plot(x, x**2, label='Quadratic')
ax.plot(x, x**1.5, label='Power 1.5')
ax.plot(x, x, label='Linear')
ax.legend(title='Modelos de crescimento', title_fontsize=13, fontsize=11)
plt.show()Handles de legenda personalizados
Entradas manuais de legenda
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import matplotlib.lines as mlines
import numpy as np
fig, ax = plt.subplots(figsize=(8, 5))
# Plotar sem labels
ax.scatter(np.random.randn(50), np.random.randn(50), c='blue', s=20)
ax.scatter(np.random.randn(50) + 2, np.random.randn(50), c='red', s=20)
# Criar handles personalizados
blue_patch = mpatches.Patch(color='blue', label='Grupo A')
red_patch = mpatches.Patch(color='red', label='Grupo B')
line_handle = mlines.Line2D([], [], color='green', linestyle='--', label='Limiar')
ax.legend(handles=[blue_patch, red_patch, line_handle])
plt.show()Legenda para dispersão com mapeamento de cores
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(8, 5))
categories = ['A', 'B', 'C']
colors = ['#e74c3c', '#3498db', '#2ecc71']
for cat, color in zip(categories, colors):
x = np.random.randn(30)
y = np.random.randn(30)
ax.scatter(x, y, c=color, label=f'Categoria {cat}', alpha=0.7, s=50)
ax.legend()
plt.show()Opções de personalização da legenda
| Parâmetro | Descrição | Exemplo |
|---|---|---|
loc | String ou número de posição | 'upper right', 2 |
bbox_to_anchor | Ponto de ancoragem (x, y) | (1.0, 0.5) |
ncol | Número de colunas | 3 |
fontsize | Tamanho do texto | 12, 'small' |
title | Título da legenda | 'My Legend' |
frameon | Mostrar moldura | True, False |
framealpha | Transparência da moldura | 0.8 |
facecolor | Cor de fundo | 'white' |
edgecolor | Cor da borda | 'gray' |
shadow | Sombra | True |
markerscale | Multiplicador do tamanho do marcador | 1.5 |
labelspacing | Espaço vertical entre entradas | 0.5 |
handlelength | Comprimento da linha da legenda | 2.0 |
Exemplos práticos
Legenda para múltiplos tipos de gráficos
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(5)
values = [23, 45, 56, 78, 32]
trend = [20, 35, 50, 65, 40]
fig, ax = plt.subplots(figsize=(8, 5))
ax.bar(x, values, alpha=0.7, label='Real', color='steelblue')
ax.plot(x, trend, 'ro-', label='Tendência', linewidth=2)
ax.axhline(y=50, color='green', linestyle='--', label='Meta')
ax.legend(loc='upper left')
ax.set_xlabel('Trimestre')
ax.set_ylabel('Receita ($K)')
plt.show()Legendas separadas para eixos duplos
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(2020, 2027)
revenue = [100, 120, 115, 140, 160, 175, 200]
employees = [50, 55, 52, 60, 70, 75, 85]
fig, ax1 = plt.subplots(figsize=(8, 5))
line1 = ax1.plot(x, revenue, 'b-o', label='Receita ($M)')
ax1.set_ylabel('Receita ($M)', color='blue')
ax2 = ax1.twinx()
line2 = ax2.plot(x, employees, 'r-s', label='Funcionários')
ax2.set_ylabel('Funcionários', color='red')
# Combinar legendas
lines = line1 + line2
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc='upper left')
plt.show()Exploração interativa de dados
Ao iterar sobre a estética do gráfico e o posicionamento da legenda, PyGWalker (opens in a new tab) permite construir visualizações interativas no Jupyter arrastando colunas -- legendas, cores e tamanhos são gerados automaticamente:
import pandas as pd
import pygwalker as pyg
df = pd.read_csv('your_data.csv')
walker = pyg.walk(df)Perguntas frequentes
Como adiciono uma legenda a um gráfico Matplotlib?
Adicione label='name' a cada chamada plot(), scatter() ou bar(), depois chame plt.legend() ou ax.legend(). A legenda usa automaticamente os labels que você forneceu.
Como movo a legenda para fora do gráfico?
Use bbox_to_anchor com loc. Para o lado direito: ax.legend(loc='center left', bbox_to_anchor=(1.0, 0.5)). Para baixo: ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1)). Chame plt.tight_layout() para evitar cortes.
Como mudo o tamanho da fonte da legenda no Matplotlib?
Passe fontsize para legend(): ax.legend(fontsize=14) ou use tamanhos em string como 'small', 'medium', 'large'. Para o título: ax.legend(title='Title', title_fontsize=16).
Como crio uma legenda com múltiplas colunas?
Use o parâmetro ncol: ax.legend(ncol=3) cria um layout de 3 colunas. Isso é útil quando você tem muitas entradas de legenda e quer um layout horizontal compacto.
Como removo a borda da legenda?
Defina frameon=False: ax.legend(frameon=False). Para manter a moldura mas torná-la transparente, use framealpha=0: ax.legend(framealpha=0).
Conclusão
As legendas do Matplotlib começam com parâmetros label e plt.legend(). Use loc para posições padrão, bbox_to_anchor para mover a legenda para fora do gráfico, ncol para layouts multi-colunas e parâmetros de estilo como fontsize, frameon e shadow para personalização. Para gráficos com muitas séries, coloque a legenda fora da área dos eixos e chame tight_layout() para evitar cortes. Para figuras complexas com eixos duplos, combine handles de linha manualmente para criar uma legenda unificada.