Visualização de Dados com Seaborn: Histogramas, Gráficos de Violino e Personalização de Estilos

A biblioteca Seaborn oferece recursos avançados para criar visualizações estatísticas em Python. Este guia explora técnicas essenciais para gerar gráficos informativos com personalização flexível.

Histogramas com Curva de Densidade

A função displot() permite criar histogramas combinados com estimativas de densidade kernel (KDE). O parâmetro kde controla a exibição da curva de densidade.

import numpy as np
import seaborn as sb
import matplotlib.pyplot as plt

# Carregando dados de exemplo
passageiros = sb.load_dataset('titanic')
dados_filtrados = passageiros[['survived', 'pclass', 'age', 'fare']].dropna()

# Histograma com densidade
sb.displot(dados_filtrados['age'], kde=True, height=5, aspect=1.2)
plt.show()

Para distribuições específicas, é possível ajustar curvas teóricas:

# Histograma sem curva de densidade
amostra_normal = np.random.standard_normal(150)
sb.histplot(amostra_normal, kde=False, stat='density')
plt.show()

# Ajuste com distribuição gamma
from scipy import stats
amostra_gamma = np.random.gamma(shape=5, scale=1, size=250)
sb.histplot(amostra_gamma, kde=True, stat='density', color='steelblue')
plt.show()

Configuração de Estilos Visuais

Seaborn disponibiliza cinco estilos predefinidos: darkgrid, whitegrid, dark, white e ticks. Cada estilo modifica a aparência dos elementos gráficos.

def curva_senoidal(inverter=1):
    dominio = np.linspace(0, 14, 100)
    for indice in range(1, 7):
        plt.plot(dominio, np.sin(dominio + indice * 0.5) * (7 - indice) * inverter)

# Aplicando diferentes estilos
sb.set_style("whitegrid")
dados_aleatorios = np.random.normal(size=(25, 6)) + np.arange(6) / 2
sb.boxplot(data=dados_aleatorios)
plt.show()

sb.set_style("dark")
curva_senoidal()
plt.show()

sb.set_style("white")
curva_senoidal()
plt.show()

sb.set_style("ticks")
curva_senoidal()
plt.show()

# Remoção de bordas com despine
curva_senoidal()
sb.despine(trim=True)
plt.show()

Gráficos de Violino

O gráfico de violino combina informações de boxplot com estimativa de densidade, revelando a forma da distribuição dos dados.

conjunto_dados = np.random.normal(size=(30, 6)) + np.arange(6) / 2

# Violino com espaçamento personalizado
sb.violinplot(data=conjunto_dados, palette="muted", inner="quartile")
sb.despine(offset=12, trim=True)
plt.show()

# Configuração alternativa de eixos
sb.violinplot(data=conjunto_dados, palette="Set2", inner="box")
sb.despine(offset=8, trim=False)
plt.show()

Boxplots e Paletas

sb.set_style("whitegrid")
sb.boxplot(data=conjunto_dados, palette="deep")
sb.despine(left=True)
plt.show()

# Comparação de paletas
sb.boxplot(data=conjunto_dados, palette="pastel")
sb.despine(left=True)
plt.show()

Organização de Múltiplos Subplots

O contexto de estilo pode ser aplicado temporariamente usando gerenciadores de contexto:

with sb.axes_style("darkgrid"):
    plt.subplot(2, 1, 1)
    curva_senoidal(1)

plt.subplot(2, 1, 2)
curva_senoidal(-1)
plt.tight_layout()
plt.show()

Para grades 2x2 com estilos distintos:

plt.figure(figsize=(10, 8))

with sb.axes_style("darkgrid"):
    plt.subplot(2, 2, 1)
    curva_senoidal(1)

with sb.axes_style("dark"):
    plt.subplot(2, 2, 2)
    curva_senoidal()

with sb.axes_style("ticks"):
    plt.subplot(2, 2, 3)
    curva_senoidal(-1)

plt.subplot(2, 2, 4)
sb.set_context("notebook", font_scale=1.3, rc={"lines.linewidth": 2.2})
curva_senoidal()

plt.tight_layout()
plt.show()

Os contextos disponíveis (paper, notebook, talk, poster) ajustam automaticamente espessura de linha e tamanho de fonte:

plt.figure(figsize=(12, 10))

contextos = [("paper", 1.4), ("notebook", 1.0), ("talk", 1.6), ("poster", 1.8)]
fatores = [1, 1, -1, 1]

for pos, ((ctx, escala), fator) in enumerate(zip(contextos, fatores), 1):
    plt.subplot(2, 2, pos)
    sb.set_context(ctx, font_scale=escala, rc={"lines.linewidth": 1.8})
    curva_senoidal(fator)
    plt.title(f"Contexto: {ctx}")

plt.tight_layout()
plt.show()

Sistemas de Cores

Paleta Categórica Padrão

paleta_atual = sb.color_palette()
sb.palplot(paleta_atual)
plt.show()

Paleta Circular HLS

Para categorias numerosas, a paleta HLS distribui cores uniformemente no espaço cromático:

sb.palplot(sb.color_palette("hls", 14))
plt.show()

# Aplicação em boxplot
dados_extensos = np.random.normal(size=(20, 14)) + np.arange(14) / 2
sb.boxplot(data=dados_extensos, palette=sb.color_palette("hls", 14))
plt.show()

Controle de luminosidade e saturação:

sb.palplot(sb.hls_palette(12, l=0.65, s=0.85))
plt.show()

Cores XKCD

plt.plot([0, 1], [0, 1], color=sb.xkcd_rgb["dusty pink"], linewidth=3)
plt.plot([0, 1], [0, 2], color=sb.xkcd_rgb["sea green"], linewidth=3)
plt.plot([0, 1], [0, 3], color=sb.xkcd_rgb["slate blue"], linewidth=3)
plt.plot([0, 1], [0, 4], color=sb.xkcd_rgb["mustard"], linewidth=4)
plt.show()

# Paleta personalizada com nomes XKCD
nomes_cores = ["cobalt blue", "amber", "brownish grey", "forest green", "dusty purple"]
sb.palplot(sb.xkcd_palette(nomes_cores))
plt.show()

Paletas Sequenciais

Cores que variam em intensiddae conforme valores numéricos:

sb.palplot(sb.color_palette("Blues", 9))
sb.palplot(sb.color_palette("Greens_r", 9))  # Versão invertida
plt.show()

Paleta Cubehelix

Transição linear de matiz com percepção uniforme:

sb.palplot(sb.color_palette("cubehelix", 10))
sb.palplot(sb.cubehelix_palette(10, start=0.4, rot=-0.6, dark=0.2, light=0.8))
plt.show()

Paletas Personalizadas Light/Dark

sb.palplot(sb.light_palette("crimson", n_colors=8))
sb.palplot(sb.light_palette("navy", reverse=True))
sb.palplot(sb.dark_palette("goldenrod", n_colors=8))
sb.palplot(sb.dark_palette((260, 75, 55), input="husl"))
plt.show()

Tags: seaborn matplotlib data-visualization statistical-graphics python-data-science

Publicado em 8-21 12:57