Matplotlib Gráfico de Dispersão: Guia Completo do plt.scatter()
Updated on
Gráficos de dispersão são a visualização preferida para explorar relações entre duas variáveis numéricas. Mas criar gráficos de dispersão eficazes -- que revelem padrões, clusters e outliers sem se tornar uma bagunça -- requer mais do que uma simples chamada plt.scatter(). Você precisa de mapeamento de cores para categorias, codificação de tamanho para uma terceira variável, rótulos de eixo adequados e tratamento de pontos sobrepostos.
O plt.scatter() do Matplotlib lida com tudo isso com um rico conjunto de parâmetros. Este guia cobre tudo, desde gráficos de dispersão básicos até técnicas avançadas como gráficos de bolhas, linhas de regressão e matrizes de dispersão multipanel.
Gráfico de Dispersão Básico
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100)
y = 2 * x + np.random.randn(100) * 0.5
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
plt.xlabel('Valores X')
plt.ylabel('Valores Y')
plt.title('Gráfico de Dispersão Básico')
plt.show()Personalização de Marcadores
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(50)
y = np.random.randn(50)
plt.figure(figsize=(8, 6))
plt.scatter(x, y,
s=100, # tamanho do marcador
c='steelblue', # cor
marker='o', # forma do marcador
alpha=0.7, # transparência
edgecolors='black', # cor da borda
linewidths=0.5, # largura da borda
)
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Gráfico de Dispersão Personalizado')
plt.show()Formas de Marcador Comuns
| Marcador | Símbolo | Descrição |
|---|---|---|
'o' | Círculo | Padrão |
's' | Quadrado | |
'^' | Triângulo para cima | |
'D' | Diamante | |
'*' | Estrela | |
'+' | Mais | |
'x' | Cruz | |
'.' | Ponto | Pequeno, para dados densos |
Cor por Categoria
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 50
# Três categorias
categories = ['A', 'B', 'C']
colors = ['#e74c3c', '#3498db', '#2ecc71']
plt.figure(figsize=(8, 6))
for cat, color in zip(categories, colors):
x = np.random.randn(n) + (categories.index(cat) * 2)
y = np.random.randn(n) + (categories.index(cat) * 1.5)
plt.scatter(x, y, c=color, label=cat, alpha=0.7, s=60, edgecolors='white')
plt.xlabel('Característica 1')
plt.ylabel('Característica 2')
plt.title('Gráfico de Dispersão Colorido por Categoria')
plt.legend()
plt.show()Mapeamento de Cor (Variável Contínua)
Use o parâmetro c com um array numérico e um mapa de cores para codificar uma terceira variável como cor:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(200)
y = np.random.randn(200)
values = x ** 2 + y ** 2 # Distância da origem
plt.figure(figsize=(8, 6))
scatter = plt.scatter(x, y, c=values, cmap='viridis', s=50, alpha=0.8)
plt.colorbar(scatter, label='Distância da Origem')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Gráfico de Dispersão com Mapeamento de Cor')
plt.show()Mapas de Cores Populares
| Mapa de Cores | Tipo | Melhor Para |
|---|---|---|
'viridis' | Sequencial | Padrão, perceptualmente uniforme |
'plasma' | Sequencial | Alto contraste |
'coolwarm' | Divergente | Valores positivos/negativos |
'RdYlGn' | Divergente | Faixas bom/ruim |
'Set1' | Qualitativo | Dados categóricos |
Codificação de Tamanho (Gráfico de Bolhas)
Codifique uma terceira variável como tamanho do marcador para criar um gráfico de bolhas:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
countries = ['US', 'China', 'India', 'Germany', 'Japan', 'UK', 'Brazil', 'France']
gdp = np.array([21.43, 14.34, 2.87, 3.86, 5.08, 2.83, 1.87, 2.72])
population = np.array([331, 1402, 1380, 83, 126, 67, 213, 67])
growth = np.array([2.3, 5.8, 6.5, 1.1, 0.8, 1.4, 1.2, 1.5])
plt.figure(figsize=(10, 7))
scatter = plt.scatter(gdp, growth,
s=population * 2, # Escalar população para tamanhos visíveis
c=range(len(countries)),
cmap='tab10',
alpha=0.6,
edgecolors='black',
)
for i, country in enumerate(countries):
plt.annotate(country, (gdp[i], growth[i]),
textcoords="offset points", xytext=(10, 5), fontsize=9)
plt.xlabel('PIB (Trilhões USD)')
plt.ylabel('Taxa de Crescimento do PIB (%)')
plt.title('PIB vs Taxa de Crescimento (tamanho da bolha = população)')
plt.show()Adicionar uma Linha de Regressão
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(100) * 3
y = 1.5 * x + np.random.randn(100) * 2
# Ajustar regressão linear
coefficients = np.polyfit(x, y, 1)
poly = np.poly1d(coefficients)
x_line = np.linspace(x.min(), x.max(), 100)
plt.figure(figsize=(8, 6))
plt.scatter(x, y, alpha=0.6, s=40, label='Dados')
plt.plot(x_line, poly(x_line), 'r-', linewidth=2,
label=f'y = {coefficients[0]:.2f}x + {coefficients[1]:.2f}')
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Gráfico de Dispersão com Linha de Regressão')
plt.legend()
plt.show()Tratamento de Pontos Sobrepostos
Quando os pontos se sobrepõem muito, use transparência, marcadores menores ou técnicas baseadas em densidade:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
x = np.random.randn(5000)
y = np.random.randn(5000)
fig, axes = plt.subplots(1, 3, figsize=(15, 5))
# Método 1: Transparência
axes[0].scatter(x, y, alpha=0.1, s=10)
axes[0].set_title('Transparência Alpha')
# Método 2: Marcadores pequenos
axes[1].scatter(x, y, s=1, c='black')
axes[1].set_title('Marcadores Pequenos')
# Método 3: Histograma 2D (hexbin)
axes[2].hexbin(x, y, gridsize=30, cmap='YlOrRd')
axes[2].set_title('Densidade Hexbin')
plt.tight_layout()
plt.show()Múltiplos Subgráficos
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
n = 100
fig, axes = plt.subplots(2, 2, figsize=(10, 10))
# Gráfico 1: Linear
x1 = np.random.randn(n)
axes[0, 0].scatter(x1, 2 * x1 + np.random.randn(n) * 0.5, c='steelblue', s=30)
axes[0, 0].set_title('Relação Linear')
# Gráfico 2: Quadrático
x2 = np.linspace(-3, 3, n)
axes[0, 1].scatter(x2, x2**2 + np.random.randn(n) * 0.5, c='coral', s=30)
axes[0, 1].set_title('Relação Quadrática')
# Gráfico 3: Clusters
for i, c in enumerate(['red', 'blue', 'green']):
cx = np.random.randn(30) + i * 3
cy = np.random.randn(30) + i * 2
axes[1, 0].scatter(cx, cy, c=c, s=30, alpha=0.7)
axes[1, 0].set_title('Dados Agrupados')
# Gráfico 4: Sem correlação
axes[1, 1].scatter(np.random.randn(n), np.random.randn(n), c='purple', s=30, alpha=0.5)
axes[1, 1].set_title('Sem Correlação')
plt.tight_layout()
plt.show()Gráficos de Dispersão Interativos com PyGWalker
Para análise exploratória de dados, gráficos de dispersão estáticos são apenas o ponto de partida. PyGWalker (opens in a new tab) transforma seu DataFrame pandas em uma interface interativa estilo Tableau diretamente no Jupyter. Você pode arrastar colunas para os eixos, adicionar codificações de cor e tamanho e filtrar dados -- tudo sem escrever código adicional:
import pandas as pd
import pygwalker as pyg
df = pd.DataFrame({'x': x, 'y': y, 'category': np.random.choice(['A', 'B', 'C'], len(x))})
walker = pyg.walk(df)Referência de Parâmetros do plt.scatter()
| Parâmetro | Tipo | Descrição |
|---|---|---|
x, y | tipo array | Posições dos dados |
s | escalar ou array | Tamanho(s) do marcador em pontos^2 |
c | cor ou array | Cor(es) do marcador. Array para mapa de cores |
marker | str | Estilo do marcador ('o', 's', '^', etc.) |
cmap | str ou Colormap | Mapa de cores quando c é numérico |
alpha | float (0-1) | Transparência |
edgecolors | cor | Cor da borda do marcador |
linewidths | float | Largura da borda do marcador |
vmin, vmax | float | Limites da faixa do mapa de cores |
label | str | Rótulo da legenda |
FAQ
Como criar um gráfico de dispersão no Matplotlib?
Use plt.scatter(x, y) onde x e y são arrays do mesmo comprimento. Adicione plt.xlabel(), plt.ylabel() e plt.title() para rótulos. Chame plt.show() para exibir o gráfico.
Como colorir pontos do gráfico de dispersão por categoria?
Itere sobre as categorias e chame plt.scatter() para cada uma com um parâmetro c diferente e um label. Depois chame plt.legend() para mostrar a legenda. Alternativamente, passe um array numérico para c com um mapa de cores para coloração contínua.
Como adicionar uma linha de tendência a um gráfico de dispersão?
Use np.polyfit(x, y, grau) para ajustar um polinômio, crie um np.poly1d() a partir dos coeficientes e plote com plt.plot(). Para grau=1, isso dá uma linha de regressão linear.
Qual é a diferença entre plt.scatter() e plt.plot()?
plt.scatter() cria marcadores individuais com controle por ponto sobre tamanho, cor e forma. plt.plot() com estilo de marcador cria pontos conectados com aparência uniforme. Use scatter() quando os pontos precisam de estilo individual; use plot() para gráficos de linha ou marcadores uniformes.
Como lidar com pontos sobrepostos em um gráfico de dispersão?
Use alpha (transparência) para revelar a densidade, reduza o tamanho s do marcador, use plt.hexbin() para mapas de calor de densidade, ou desloque os pontos levemente com pequenos offsets aleatórios.
Conclusão
O plt.scatter() do Matplotlib é a ferramenta padrão para criar gráficos de dispersão em Python. Para exploração básica, um simples plt.scatter(x, y) é suficiente. Para figuras de qualidade de publicação, aproveite o mapeamento de cores para categorias, a codificação de tamanho para uma terceira variável, linhas de regressão para tendências e transparência para dados densos. Domine essas técnicas e você poderá visualizar qualquer relação bivariada de forma eficaz.