2.6 Visualização
A graph is a set of points. A mathematical graph cannot be seen. It is an abstraction. A graphic, however, is a physical representation of a graph. This representation is accomplished by realizing graphs with aesthetic attributes such as size or color. (Wilkinson 2005, 6)
Visualização é o processo de representar informações ou ideias através de diagramas, gráficos e outros métodos de apresentação visual. De um modo geral, as ferramentas de visualização devem ser claras para o leitor, devendo-se evitar detalhes desnecessários. Um bom visualizador transmite a informação desejada de forma clara, precisa e eficiente.
De acordo com (Kopf 1916), além de “quarenta anos de pensamento e realização na questão indiana” (Walker 1874), “salvaguardando a saúde do soldado britânico”, “reorganizando a administração hospitalar civil e militar no país e no exterior” e “seus serviços pioneiros para a profissão de enfermagem”, as atividades de Florence Nightingale na Estatística “podem ser classificadas em várias categorias amplas”. “A Dama com a Lâmpada”, uma “estatística apaixonada” de acordo com (E. Cook 1913), popularizou o diagrama de área polar, o que ela chamou de “coxcombs” (Cohen 1984). Além disso, fez um excelente trabalho na parte de visualização na documentação de informações relacionadas às frentes de guerra (Nightingale 1858).
Edward Tufte, “o Leonardo da Vinci dos dados” segundo The New York Times, ou “o Galileu dos gráficos” de acordo com a Bloomberg, possui uma vasta obra sobre o tema, destacando-se (Tufte 1993), (Tufte et al. 1998), (Tufte and Graves-Morris 2001), (Tufte 2006) e (Tufte 2020). Mais recentemente encontram-se artistas visuais como Karim Douieb16, que possui um considerável portfolio publicado.
Baseado em Tufte (1993) e Cleveland (1993), Rob Hyndman sugere 20 regras para bons gráficos.
- Use gráficos vetoriais como eps ou pdf.
- Use fontes legíveis.
- Evite legendas desorganizadas.
- Se você precisar usar uma legenda, mova-a para dentro do gráfico.
- Não use fundos escuros sombreados.
- Evite linhas de grade escuras e dominantes.
- Mantenha os limites dos eixos sensatos.
- Não se esqueça de especificar as unidades.
- Os intervalos de escala devem estar em números redondos e agradáveis.
- Os eixos devem ser rotulados corretamente.
- Use larguras de linha grandes o suficiente para leitura.
- Evite sobreposição de texto em caracteres ou linhas de plotagem.
- Siga os princípios de Tufte removendo lixo de gráficos e mantendo uma alta proporção de dados-tinta.
- Os gráficos devem ser autoexplicativos.
- Use uma proporção de tela sensata.
- Use pontos, não linhas, se a ordem dos elementos não for relevante.
- Use linhas se a ordem dos elementos for relevante (por exemplo, tempo).
- Use escalas comuns para comparação (ou um único gráfico).
- Evite gráficos de pizza. Especialmente gráficos de pizza 3D. Especialmente gráficos de pizza 3D com fatias explosivas.
- Nunca use padrões de preenchimento como hachuras cruzadas.
2.6.1 Exemplos
Exemplo 2.51 Visualização considerando os princípios indicados.
by Max Roser at ourworldindata.org/longtermism
- It is these 109 billion people we have to thank for the civilization that we live in. The languages we speak, the food we cook, the music we enjoy, the tools we use – what we know we learned from them.
- Max Roser (2022-03-15)
Exemplo 2.52 De acordo com (Zabala 2009), se há três candidatos na iminência do empate técnico conforme o método adotado pelos institutos de pesquisa – i.e., \(A\) empata com \(B\) por um ponto, \(B\) empata com \(C\) por um ponto mas \(A\) e \(C\) não empatam (??) –, a elipse azul no simplex abaixo indica os prováveis cenários eleitorais com uma amostra de tamanho 500. No caso, deve haver segundo turno entre \(A\) e \(B\).
2.6.2 Gráficos básicos
2.6.2.1 Pizza/Setores
O princípio do gráfico de setores, o popular gráfico de pizza, é desenhar setores/fatias proporcionais às frequências das categorias. Seguindo a etiqueta da apresentação gráfica, recomenda-se a utilização deste tipo de gráfico para, no máximo, dez categorias. Por padrão os setores são apresentados em sentido anti-horário iniciando em 0º.
atend <- c(90,62,31,44,13) # Número de atendimentos
colors <- gray(0:4/4) # Cinco tons de cinza
atend_rel <- round(atend/sum(atend) * 100, 1) # Calculando os percentuais
atend_rel <- paste(atend_rel, '%', sep='') # Adicionando '%'
# Frequência (da classe)
pie(atend, main = 'Atendimentos', col = colors, labels = atend,
cex = 1.2, cex.main = 1.7)
legend(1.1, 0.9, c('Seg','Ter','Qua','Qui','Sex'), cex = 1.3, fill = colors,
box.col = 'white')
2.6.2.2 Barras e Colunas
O gráfico de barras é usualmente utilizado para apresentar dados classificados em categorias não ordenadas. Barras retangulares de mesma largura são dispostas sobre as categorias com altura proporcional às frequências ou outra medida associada com as categorias. Podem ser dispostas na horizontal ou vertical; quando agrupadas desta última forma, chama-se gráfico de colunas. É um gráfico bastante versátil, pois permite representar a informação de diversas maneiras.
# Dados
custos <- c(760, 640, 75, 850, 100)
names(custos) <- c('educacao', 'aliment.', 'eletricidade', 'moradia', 'internet')
# Barras
barplot(custos, xlab = 'Custo (R$)', main = 'Custos pessoais',
col = gray(0:4/4), las = 0, cex.main = 1.6, horiz = TRUE)
# Colunas
barplot(custos, ylab = 'Custo (R$)', main = 'Custos pessoais',
col = gray(0:4/4), las = 0, cex.main = 1.6)
# Colunas empilhadas
library(vcd)
trat <- table(Arthritis$Improved, Arthritis$Treatment)
rownames(trat) <- c('Nenhuma melhora', 'Alguma melhora', 'Plena melhora')
colnames(trat) <- c('Placebo', 'Tratamento')
barplot(trat,
main = 'Placebo vs trat.',
ylab = 'Frequência',
col = c('black', 'grey', 'white'),
cex.main = 1.6)
legend(1.5, 40, rownames(trat), cex = 1, fill = colors[c(1,3,5)],
box.col = 'white')
2.6.2.3 Histograma
The histogram is the classical nonparametric density estimator, probably dating from the mortality studies of John Graunt in 1662. (Scott 1979, 605)
O histograma é um gráfico de barras sem espaçamento utilizado para representar distribuições de frequência de variáveis contínuas. O termo foi introduzido por Karl Pearson “em suas palestras sobre estatística como um termo para uma forma comum de representação gráfica, ou seja, por colunas marcando como áreas a frequência correspondente ao alcance de sua base”. (Pearson 1895, 399)
Apresenta-se a variável dividida em classes no eixo horizontal (\(x\)) e a frequência de cada classe no eixo vertical (\(y\)). Os pacotes computacionais em geral definem o número de classes pela regra de Sturges conforme Eq. (2.3). É uma ferramenta básica de análise exploratória de dados para avaliar a dispersão e forma dos dados, detectar valores atípicos e sugerir modelos e transformações para análises mais avançadas.
# Dados
h <- read.csv('https://filipezabala.com/data/hospital.csv', header = TRUE)
# Histograma padrão
hist(h$height, prob = FALSE, right = FALSE, breaks = 'sturges', main = '',
xlab = 'Altura (m)', col = 'grey')
2.6.2.4 Boxplot
Introduzido por (Tukey 1977), o boxplot ou diagrama em caixa é um gráfico em formato retangular limitado pelo primeiro e terceiro quartis, onde a linha central é a mediana. A distância entre os quartis é a amplitude interquartílica conforme Seção 2.4.5 e contempla \(50\%\) dos dados centrais. Pontos que ultrapassam \(1.5\) vez a amplitude interquartílica acima (abaixo) de \(Q_{3}\) (\(Q_{1}\)) são chamados outliers. Variações são discutidas por (McGill, Tukey, and Larsen 1978), (Benjamini 1988) e (Esty and Banfield 2003).
# dados
h <- read.csv('https://filipezabala.com/data/hospital.csv', header = TRUE)
# Boxplot
boxplot(h$children, main = 'Número de filhos', ylab = 'Número de filhos',
las = 1, cex.main = 1.6)
legend(1.32, 0.1, 'Mínimo', box.col = 'white')
arrows(x0 = 1.35, y0 = 0, x1 = 1.25, y1 = 0, length = 0.15)
legend(1.32, 1.1, 'Q1', box.col = 'white')
arrows(x0 = 1.35, y0 = 1, x1 = 1.25, y1 = 1, length = 0.15)
legend(1.32, 2.1, 'Mediana', box.col = 'white')
arrows(x0 = 1.35, y0 = 2, x1 = 1.25, y1 = 2, length = 0.15)
legend(1.32, 3.1, 'Q3', box.col='white')
arrows(x0 = 1.35, y0 = 3, x1 = 1.25, y1 = 3, length = 0.15)
legend(1.32, 6.1, 'Máximo', box.col = 'white')
arrows(x0 = 1.35, y0 = 6, x1 = 1.25, y1 = 6, length = 0.15)
# Proporcional ao tamanho do grupo
set.seed(1); y <- c(rpois(50, lambda=1.5), rnorm(300,4), (1:150)/17)
x <- factor(c(rep('A',50), rep('B',300), rep('C',150) ))
bp <- boxplot(y ~ x, varwidth = TRUE, las = TRUE, main = 'Variável W',
cex.main = 1.6)
mtext(paste('(n=', bp$n, ')', sep = ''), at = seq_along(bp$n), line = 2,
side = 1)
# Vertical
boxplot(count ~ spray, data = InsectSprays, col = 'lightgray',
main = 'Pontuação em um teste', ylab = 'Pontos', xlab = 'Grupo',
las = 1, cex.main = 1.6)
legend(2.85, 18.5, 'Outliers', box.col = 'white')
arrows(x0 = 3.4,y0 = 15, x1 = 3.05, y1 = 7.8, length = 0.15)
arrows(x0 = 3.4,y0 = 15, x1 = 3.9, y1 = 12.3, length = 0.15)
2.6.2.5 Gráfico de Dispersão
O gráfico de dispersão apresenta a relação entre duas variáveis numéricas. É uma ferramenta útil no ajuste dos modelos apresentados no Capítulo 7.
performance <- 0.42515199183708*mtcars$mpg
weight <- 0.453592*mtcars$wt*1000
displacement <- 16.387064*mtcars$disp
rear_axle_ratio <- mtcars$drat
# Gráfico de dispersão
plot(weight, performance,
main = 'Performance (km/L) vs Weight (kg)',
xlab = 'Car weight (kg)',
ylab = 'Performance (km/L)',
pch = 19, las = 1, cex.main = 1.6)
2.6.2.6 Correlograma
Adaptado de http://www.r-graph-gallery.com/97-correlation-ellipses/.
# Bibliotecas
# install.packages(c('ellipse','RColorBrewer'), dep=T)
library(ellipse)
library(RColorBrewer)
# Usando o famoso banco de dados 'mtcars'
data <- cor(mtcars)
# Painel de 100 cores com Rcolor Brewer
my_colors <- brewer.pal(5, "Spectral")
my_colors <- colorRampPalette(my_colors)(100)
# Ordenando a matriz de correlação
ord <- order(data[1, ])
data_ord <- data[ord, ord]
plotcorr(data_ord , col=my_colors[data_ord*50+50] , mar=c(1,1,1,1))
Adaptado de http://r-statistics.co/Top50-Ggplot2-Visualizations-MasterList-R-Code.html#Correlogram.
# Bibliotecas
# devtools::install_github("kassambara/ggcorrplot")
library(ggplot2)
library(ggcorrplot)
# Matriz de correlação
data(mtcars)
corr <- round(cor(mtcars), 1)
# Gráfico
ggcorrplot(corr, hc.order = TRUE,
type = 'lower',
lab = TRUE,
lab_size = 3,
method = 'circle',
colors = c('tomato2', 'white', 'springgreen3'),
title = 'Correlograma de mtcars',
ggtheme = theme_bw)
2.6.4 Para saber mais
- Krause, Rennie and the Royal Statistical Society (2023), agradeço a Luiz Eduardo de Souza pela sugestão.
- Kabakoff (2020-12-01) - Data Visualization with R
- Wilke (2019-04-30) - Fundamentals of Data Viz
- Healy (2018-04-25) - Data Visualization: A practical introduction
- Ben Fry (2007) - Visualizing Data