Primeiros Passos com ggplot2
Lineu Alberto Cavazani de Freitas
Parte primordial de qualquer análise estatística é chamada análise descritiva ou exploratória. Tal etapa consiste basicamente de resumos numéricos e análises gráficas baseadas em conjuntos de dados.
Trata-se de uma etapa de extrema importância e deve preceder qualquer análise mais sofisticada como ajuste de modelos de regressão, por exemplo. Além disso, a análise exploratória não requer elevada proficiência em tópicos avançados de estatística para para aplicação e interpretação dos resultados, fazendo com que visualização de dados caracterize uma técnica simples, com grande apelo visual e extremamente informativa quanto ao conjunto de dados.
No R há a possibilidade de gerar gráficos sem a utilização de pacotes e há também pacotes específicos e especializados em visualização, dentre os quais destacam-se os famosos lattice
e ggplot2
.
Este post tem como foco explorar as principais e mais simples formas de visualização de dados utilizando o ggplot2
bem como algumas customizações simples como alteração de cores, temas, etc.
ggplot2
O ggplot2
é um pacote para geração de gráficos baseado no livro ‘The Grammar of Graphics’. Nele, o usuário fornece os dados, especifica como mapear as variáveis e que tipo de visualização usar. Após isso basta customizar cores, formas e tamanho dos atributos.
Para instalação do pacote basta utilizar a função install.packages()
, da seguinte forma:
ggplot()
A principal função do pacote é a ggplot()
. Esta função cria um objeto ggplot no qual devem ser declarados os dados e especificar o conjunto de características que vão compor o gráfico.
Leia a documentação da função com o comando:
O primeiro passo para abrir uma janela gráfica no ggplot2
é especificar o data frame no argumento data e, dentro do aes() informar qual variável ficará no eixo x e qual ficará no eixo y. Além disso pode-se acrescentar outras variáveis ao aes() que serão representadas por cores, formas ou tamanhos diferentes.
Apenas o comando acima, declarando corretamente os dados e as variáveis, uma janela gráfica em branco é aberta e , para acrescentar pontos, linhas e formas ao gráfico são utilizados os ‘geoms’ do ggplot. Os geoms disponíveis do pacote são:
## [1] "geom_abline" "geom_area" "geom_bar"
## [4] "geom_bin2d" "geom_blank" "geom_boxplot"
## [7] "geom_col" "geom_contour" "geom_count"
## [10] "geom_crossbar" "geom_curve" "geom_density"
## [13] "geom_density_2d" "geom_density2d" "geom_dotplot"
## [16] "geom_errorbar" "geom_errorbarh" "geom_freqpoly"
## [19] "geom_hex" "geom_histogram" "geom_hline"
## [22] "geom_jitter" "geom_label" "geom_line"
## [25] "geom_linerange" "geom_map" "geom_path"
## [28] "geom_point" "geom_pointrange" "geom_polygon"
## [31] "geom_qq" "geom_qq_line" "geom_quantile"
## [34] "geom_raster" "geom_rect" "geom_ribbon"
## [37] "geom_rug" "geom_segment" "geom_sf"
## [40] "geom_smooth" "geom_spoke" "geom_step"
## [43] "geom_text" "geom_tile" "geom_violin"
## [46] "geom_vline"
A sintaxe para geração de um gráfico de dispersão simples é:
ggplot(data = dados, # conjunto de dados
mapping = aes(x = x, # variável x
y = y)) + # variável y
geom_point() # especifica que x e y serão representados como pares ordenados
Pode-se acrescentar mais de um geom ao mesmo gráfico apenas com o acréscimo do sinal de mais (+).
Para verificar os tipos de gráficos mais comuns em análise exploratória e como customizar gráficos com o ggplot2
, vamos analisar um conjunto de dados simulados.
Vamos gerar e analisar um conjunto de dados comum, composto por duas variáveis numéricas e uma variável categórica:
v1 = rnorm(1500, 20, 5)
v2 = rnorm(1500, 20, 5 )
x = v1*2
y = v1+v2
z = rep(c('a','b'), 750)
df <- data.frame(x=x,y=y,z=z)
head(df)
## x y z
## 1 31.61067 35.11138 a
## 2 46.96268 43.00292 b
## 3 44.18966 42.14678 a
## 4 33.99729 23.37712 b
## 5 46.76924 50.93995 a
## 6 27.92536 37.30418 b
Uma análise básica do conjunto de dados gerado utilizando as funções base do R:
par(mfrow = c(1,3), par(oma=c(0,3,3,0)))
hist(df$y,probability = T, main = 'Histograma',col=3)
box()
lines(density(df$y), lwd=3, col=4)
plot(y~z, df, col = c(3,4), main='Boxplot')
mtext("Gráficos Base", side=3, line=3, cex=1 )
plot(y~x,df, col=c(3,4), main='Gráfico de Dispersão')
abline(lm(y~x, df), lwd=3)
ggplot2
Como o ggplot2
é um pacote, é necessário carregá-lo:
Um gráfico de densidade simples pode ser feito com os seguintes comandos:
Dentro de um geom é possível acrescentar elementos extra para customização dos gráficos, por exemplo: o argumento col
altera a cor do contorno, o argumento fill
altera a cor de preenchimento e o alpha
controla o aspecto de transparência do gráfico. Pode-se também acrescentar um geom_rug()
:
Para gerar um histograma, basta acrescentar à função ggplot um geom_histogram()
:
E pode-se incluir as mesmas customizações utilizadas no gráfico de densidade, inclusive ao geom_rug
:
ggplot(data=df, mapping = aes(x=y)) +
geom_histogram(col=6, fill='#00FFFF', alpha=0.3) +
geom_rug(col=2, alpha=0.5)
Ainda com foco nas análises univariadas, uma alternativa ao gráfico de densidade e ao histograma é o boxplot:
Para duas variáveis numéricas o gráfico de maior importância é o de dispersão, que pode ser gerado utilizando o geom_point()
:
Pode-se ainda gerar um gráfico utilizando todas as variáveis do nosso data frame, com uma variável numérica no eixo x, outra no eixo y e com diferentes cores representando a variável categórica, tais atributos são definidos dentro do aes()
. Há a possibilidade de adicionar linhas de tendência ao gráfico com o uso do geom_smooth()
:
ggplot(data=df, mapping = aes(x=x,y=y,col=z)) +
geom_point(alpha=0.8) +
geom_smooth(method = 'lm', col=1) +
geom_rug(alpha=0.1)
Para verificar o comportamento de uma variável categórica nos valores observados de uma variável numérica o boxplot se mostra uma boa alternativa, a diferença do caso já mencionado é que aqui temos uma variável x (fator) e uma variável y (numérica):
E algumas customizações:
A atribuição de eixos e títulos faz-se com uso do ggtitle()
, xlab()
e ylab()
:
ggplot(data=df, mapping = aes(x=x,y=y))+
geom_point(alpha=0.5)+
ggtitle('Título')+
xlab('Eixo x')+
ylab('Eixo y')
O facet_wrap()
permite gerar gráficos em que faz-se a distinção entre os níveis de um fator:
ggplot(data=df, mapping = aes(x=x,y=y,col=z)) +
geom_point(alpha=0.5)+
geom_smooth(se=F, lwd=1.5, col=1) +
facet_wrap(~z)
Além dos gráficos já mencionados, alguns outros são comumentes utilizados em análises exploratórias:
O gráfico de barras é utilizado quado há interesse em observar frequências. Vamos considerar o seguinte conjunto de dados:
dados <- data.frame(fator = factor(c("a","b","c","d","e"),
levels=c("a","b","c","d","e")),
contagem = c(125, 170, 124, 128, 163))
dados
## fator contagem
## 1 a 125
## 2 b 170
## 3 c 124
## 4 d 128
## 5 e 163
No ggplot2
, um gráfico de barras pode ser gerado da seguinte forma:
Outra alternativa para visualização de frequências é o gráfico de setores, para representação deste gráfico vamos considerar um novo data frame:
dados <- data.frame(fator = factor(c("a","b","c","d","e","f"),
levels=c("a","b","c","d","e", "f")),
contagem = c(125, 170, 124, 128, 163, 500))
E o gráfico de setores pode ser gerado com os comandos:
Para confecção deste gráfico utiliza-se o geom_violin()
, o gráfico consiste no espelhamento do gráfico de densidade da variável; pode ser utilizado para explorar uma variável numérica ou para verificar o efeito de níveis de um fator sobre uma variável numérica:
dados <- data.frame(x = rep(c('a','b','c','d'),50),
y = rgamma(200, 12,3))
ggplot(data=dados, mapping = aes(x=x,
y=y,
fill=x,
col=x))+
geom_violin(alpha=0.5, lwd=2)+
theme(legend.position = 'none')
O clássico par(mfrow = c())
não é aplicável a gráficos ggplot2
. Porém é possível gerar gráficos em painel através da função grid.arrange
do pacote gridExtra
:
g1 <- ggplot(data=df, mapping = aes(x=y))+
geom_density(col=2, fill=2, alpha=0.3)
g2 <- ggplot(data=df, mapping = aes(x=y))+
geom_histogram(col=6, fill=6, alpha=0.3)
g3 <- ggplot(data=df, mapping = aes(x=x,y=y,col=z))+
geom_point(alpha=0.5)+
geom_smooth(col=1)
g4 <- ggplot(data=df, mapping = aes(x=z,y=y,col=z)) +
geom_boxplot(col=c(3,4),
fill=c(3,4),
alpha=0.3)
O pacote tem uma variedade de temas:
## [1] "theme_bw" "theme_classic" "theme_dark" "theme_get"
## [5] "theme_gray" "theme_grey" "theme_light" "theme_linedraw"
## [9] "theme_minimal" "theme_replace" "theme_set" "theme_test"
## [13] "theme_update" "theme_void"
Para utlizá-los, basta acrescentar + theme_(nome do tema)
. Alguns são extremamente parecidos. Confira os principais:
Com o pacote plotly
é possível converter gráficos gerados com ggplot2
em gráficos interativos com o uso da função ggplotly
:
ind <- sample(nrow(diamonds),4500,replace = F)
graf <-
ggplot(data=diamonds[ind,], aes(x=price,y=carat,col=clarity)) +
geom_point(alpha=0.5) +
geom_rug(alpha=0.1, col='#F781F3')+
geom_smooth(method='lm',se=F, col=1)+
geom_smooth(method='loess',se=F,
col='#FF0040',
linetype = 'longdash')
library(plotly)
ggplotly(graf)
O intuito deste material foi explorar a confecção e customização de gráficos fazendo uso do ggplot2
. O aprendizado e a própria customização dos gráficos pode ser de certa forma trabalhosa devido às diferenças de sintaxe dos gráficos produzidos no R e às inúmeras possíveis combinações de geoms e parâmetros que controlam a estética dos gráficos. Contudo, o pacote permite a geração de gráficos que, no geral, são mais atrativos visualmente que aqueles gerados utilizando o R base e que, com uso do plotly
, são facilmente convertidos para gráficos interativos.