Skip to content

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 locNú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âmetroDescriçãoExemplo
locString ou número de posição'upper right', 2
bbox_to_anchorPonto de ancoragem (x, y)(1.0, 0.5)
ncolNúmero de colunas3
fontsizeTamanho do texto12, 'small'
titleTítulo da legenda'My Legend'
frameonMostrar molduraTrue, False
framealphaTransparência da moldura0.8
facecolorCor de fundo'white'
edgecolorCor da borda'gray'
shadowSombraTrue
markerscaleMultiplicador do tamanho do marcador1.5
labelspacingEspaço vertical entre entradas0.5
handlelengthComprimento da linha da legenda2.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.

📚