Skip to content

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

MarcadorSímboloDescrição
'o'CírculoPadrão
's'Quadrado
'^'Triângulo para cima
'D'Diamante
'*'Estrela
'+'Mais
'x'Cruz
'.'PontoPequeno, 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 CoresTipoMelhor Para
'viridis'SequencialPadrão, perceptualmente uniforme
'plasma'SequencialAlto contraste
'coolwarm'DivergenteValores positivos/negativos
'RdYlGn'DivergenteFaixas bom/ruim
'Set1'QualitativoDados 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âmetroTipoDescrição
x, ytipo arrayPosições dos dados
sescalar ou arrayTamanho(s) do marcador em pontos^2
ccor ou arrayCor(es) do marcador. Array para mapa de cores
markerstrEstilo do marcador ('o', 's', '^', etc.)
cmapstr ou ColormapMapa de cores quando c é numérico
alphafloat (0-1)Transparência
edgecolorscorCor da borda do marcador
linewidthsfloatLargura da borda do marcador
vmin, vmaxfloatLimites da faixa do mapa de cores
labelstrRó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.

📚