SÉRIE DE GRÁFICOS: GRÁFICO DE VIOLINO

ME: Gráfico de Violino.

Olá, Letícia da Minha Estatística aqui :). Click here to go to the post in English.

Essa vai ser a primeira série do blog e é tudo sobre gráficos. Vou postar toda segunda sobre um tipo de gráfico, que você pode fazer através do R ou Python (vou incluir resoluções para dos dois em cada post). O objetivo é aprender sobre quando e como um tipo de gráfico deve e pode ser aplicado, dependendo do tipo de dado que você tem. Então vamos começar!

O gráfico a inaugurar esta série é o Gráfico de Violino. Este gráfico é usado para dados numéricos para comparar as estimativas da densidade entre diferentes grupos, ou de uma variável em relação a um denominador comum que compartilham. Onde cada violino é um grupo e a densidade mostrada representa a estimativa de densidade do núcleo (ou estimativa de densidade kernel (KDE)), o que significa que os dados são transformados (ou seja, suavizados) seja para melhor visualização ou melhor ajuste, tornando-o adequado também para conjunto de dados grandes. O valor da suavização é algo que pode ser determinado ao longo do processo.

O plot tem partes maiores onde os dados são mais frequentes ou mais densos, e partes menores onde ocorre o oposto, mostrando e proporcionando uma visão completa da distribuição. Ele pode ser apresentado com um boxplot dentro, com diferentes cores e legendas indicando o valor da densidade, ou não. A seguir, o gráfico será criado em R usando ggplot2, e depois em Python com Seaborn e Matplotlib.

1) Gráfico em R

    
# Load libraries:
library(ggplot2) 
library(palmerpenguins) # Para os dados
library(tydir) # Para remover valores NA
    
  

Note que o ggplot2 espera que os dados de entrada estejam no formato longo, em que cada linha representa uma observação. Para criar o gráfico, é preciso de uma variável categórica (factor) para o eixo x e uma variável numérica para o eixo y, o que significa que cada variável deve estar em uma coluna.

    
data("penguins", package = "palmerpenguins")
penguins <- drop_na(penguins) # Remover NAs
summary(penguins)
    
  

Alguns ajustes que podem ser feitos incluem alterações nas configurações padrão, como modificar o intervalo e a escala dos violinos para melhorar a visualização. O intervalo é baseado nas estimativas mínimas e no máximas de densidade, então, ao definir trim = FALSE, as caudas dos violinos se tornam mais longas,estendendo-se ao intervalo completo dos dados no eixo y, assumindo também esses valores. O argumento scale, por padrão, é "area", o que significa que a área de cada violino é a mesma e não corresponde ao número de observações e definindo scale = "count", a largura do violino torna-se proporcional ao número de observações em cada grupo, enquanto com scale = "width", todos os violinos vão ter a mesma largura máxima e o que vai mudar são suas densidades.

Outro aspecto importante do Gráfico de Violino, como mencionado anteriormente, é a suavização, que pode ser ajustada com adjust, lembrando que por padrão adjust = 1.

    
ggplot(penguins, aes(x = species, y = bill_length_mm, fill = species)) +
  geom_violin(trim = F, scale = "width", adjust = 1) +  # Cria o gráfico de violino
  labs(
    x = "Espécie", 
    y = "Comprimento do Bico (mm)", 
    title = "Distribuição do Comprimento do Bico por Espécie"
  ) +
  scale_fill_discrete(name = "Espécie") +  # Altera o título da legenda
  theme_minimal() +  # Tema limpo para melhor vizualização
  theme(
    plot.title = element_text(hjust = 0.5)  # Centraliza o título
  )
  

Adicionando um boxplot:

    
ggplot(penguins, aes(x = species, y = bill_length_mm, fill = species)) +
  geom_violin(trim = F, scale = "width", adjust = 1) + # Cria o gráfico de violino
  labs(
    x = "Espécie", 
    y = "Comprimento do Bico (mm)", 
    title = "Distribuição do Comprimento do Bico por Espécie"
  ) + 
  scale_fill_discrete(name = "Espécie") + # Altera o título da legenda
  geom_boxplot(width=0.1, # Adicionar boxplot
               show.legend = F)+  # Sem legenda para evitar sobreposição
  theme_minimal() +  # Tema limpo para melhor vizualização
  theme(
    plot.title = element_text(hjust = 0.5)  # Centraliza o título
  )    
  

Acredito que cubri os conceitos essenciais e o código necessário para criar um gráfico de violino em R. A seguir, vou mostrar como criar o mesmo gráfico em Python.

2) Gráfico em Python

Comece importando as bibliotecas para os dados, matplotlib e seaborn:

    
# Importações:
import seaborn as sea
import matplotlib.pyplot as plt
from palmerpenguins import load_penguins # Para os dados
    
  
    
# Carregar os dados:
penguins = load_penguins()
penguins = penguins.dropna() # Remover NAs
penguins.head()
    
  

Em Python, os argumentos usados para personalização e ajustes são principalmente o density_norm que aceita 'width' que significa que os violinos serão exibidos de acordo com suas densidades, 'area' onde todos terão o mesmo tamanho, desconsiderando o número de observações em cada variável e 'count' onde a largura corresponde ao número de observações. Para controlar o comprimento do violino, o argumento cut determina o quão longe os violinos se extendem no eixo y (se o gráfico estiver na vertical).

Por fim, o valor para suavização, que por padrão é = 1, pode ser personalizado com bw_method; a versão do Python que estou utilizando atualmente é 3.11.19.

    
sea.violinplot(
    data = penguins, 
    x = 'species', 
    y = 'bill_length_mm', 
    hue = 'species',
    inner = "box",  # Adiciona o boxplot dentro dos violinos 
    inner_kws = dict(box_width = 15, whis_width = 2, color = "0.8"),  # Personalizar
    density_norm = 'width',  # # Escala os violinos pela largura
    cut = 3,  # Comprimento da cauda
    bw_method = 1,  # Largura de banda para suavização KDE
    palette="Set1" 
    )
plt.xlabel('Espécie') 
plt.ylabel('Comprimento do Bico (mm)') 
plt.title('Distribuição do Comprimento do Bico por Espécie')
plt.show()

  

O gráfico também pode ser criado usando somente o Matplotlib, especialmente quando estiver trabalhando com dados list ou array. Neste caso, os dados precisam estar em um desses formatos, ao invés de um DataFrame. Usar o Matplotlib é uma boa escolha se não há necessidade de personalizar argumentos como density_norm, cut, ou bw_method:

    
# Prepare os dados:
species = penguins['species'].unique()  # Retorna uma array com as espécies
data = [] 
for sp in species:  # Agrupar bill_length_mm por espécie
    data.append(penguins[penguins['species'] == sp]['bill_length_mm'].values) 
type(data) # Os dados devem ser uma lista ou um array

  
    
plt.violinplot(
    data,
    showmedians=True
    )
plt.xticks([1, 2, 3], ['Adelie', 'Chinstrap', 'Gentoo'])  # Colocar espécies em x
plt.xlabel('Espécie') 
plt.ylabel('Comprimento do Bico (mm)') 
plt.title('Distribuição do Comprimento do Bico por Espécie')
plt.show()

  

Conclusão

Neste post, nós exploramos como visualizar distribuições de dados usando Gráficos de Violino com R e Python. Discutimos como gerar esses gráficos usando Matplotlib e Seaborn no Python, além de explocar como gráficos similares podem ser criados no R utilizando suas poderosas bibliotecas para visualização.

No Python, o Matplotlib é excelente para gerar rapidamente gráficos de violino com personalização mínima, enquanto o Seaborn oferece mais controle para criar visualizações detalhadas e personalizadas. No R, bibliotecas como o ggplot2 oferecem capacidades igualmente eficazes e flexíveis para a criação de gráficos.

Agora, você tem uma compreensão mais clara de como criar Gráficos de Violino tanto em R quanto em Python, permitindo que você entenda e escolha a melhor ferramenta para si e qual mais adequada para suas necessidades de visualização de dados.

Espero que tenha gostado deste post, como é apenas o começo da nossa Série de Gráficos!

Obrigado por estar aqui e sinta-se à vontade para comentar com perguntas ou sugestões! Fique ligado para mais insights na próxima semana,

Letícia - Minha Estatística.

Links de Referência

Comentários

Postagens mais visitadas