ggplot2
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 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:
install.packages('ggplot2')
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:
ggplot() ?
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.
ggplot(data = NULL, mapping = aes())
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"
## [3] "geom_bar" "geom_bin_2d"
## [5] "geom_bin2d" "geom_blank"
## [7] "geom_boxplot" "geom_col"
## [9] "geom_contour" "geom_contour_filled"
## [11] "geom_count" "geom_crossbar"
## [13] "geom_curve" "geom_density"
## [15] "geom_density_2d" "geom_density_2d_filled"
## [17] "geom_density2d" "geom_density2d_filled"
## [19] "geom_dotplot" "geom_errorbar"
## [21] "geom_errorbarh" "geom_freqpoly"
## [23] "geom_function" "geom_hex"
## [25] "geom_histogram" "geom_hline"
## [27] "geom_jitter" "geom_label"
## [29] "geom_line" "geom_linerange"
## [31] "geom_map" "geom_path"
## [33] "geom_point" "geom_pointrange"
## [35] "geom_polygon" "geom_qq"
## [37] "geom_qq_line" "geom_quantile"
## [39] "geom_raster" "geom_rect"
## [41] "geom_ribbon" "geom_rug"
## [43] "geom_segment" "geom_sf"
## [45] "geom_sf_label" "geom_sf_text"
## [47] "geom_spoke" "geom_step"
## [49] "geom_text" "geom_tile"
## [51] "geom_violin" "geom_vline"
## [53] "update_geom_defaults"
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:
= rnorm(1500, 20, 5)
v1 = rnorm(1500, 20, 5 )
v2
= v1*2
x = v1+v2
y
= as.factor(rep(c('a','b'), 750))
z
<- data.frame(x=x,y=y,z=z)
df
head(df)
## x y z
## 1 25.76890 33.02357 a
## 2 36.71621 41.59246 b
## 3 28.12317 36.44744 a
## 4 47.29725 44.24308 b
## 5 53.67246 43.86979 a
## 6 44.99103 46.22369 b
Uma análise básica do conjunto de dados gerado utilizando as funções base do R:
par(mfrow = c(1,3))
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')
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:
library(ggplot2)
Um gráfico de densidade simples pode ser feito com os seguintes comandos:
ggplot(data=df, mapping = aes(x=y))+
geom_density()
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()
:
ggplot(data=df, mapping = aes(x=y)) +
geom_density(col=4,
fill='#088A85',
alpha=0.3) +
geom_rug()
Para gerar um histograma, basta acrescentar à função ggplot um
geom_histogram()
:
ggplot(data=df, mapping = aes(x=x)) +
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:
ggplot(data=df, mapping = aes(y=y)) +
geom_boxplot(col=3, fill=3, alpha=0.4)
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()
:
ggplot(data=df, mapping = aes(x=x,y=y)) +
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)
## `geom_smooth()` using formula 'y ~ x'
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):
ggplot(data=df, mapping = aes(x=z,y=y,col=z)) +
geom_boxplot()
E algumas customizações:
ggplot(data=df, mapping = aes(x=z,y=y,col=z)) +
geom_boxplot(col=c(3,4), fill=c(3,4), alpha=0.3)
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 comumente 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:
<- data.frame(fator = factor(c("a","b","c","d","e"),
dados 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:
ggplot(data=dados, aes(x=fator, y=contagem)) +
geom_bar(stat="identity",
fill=5,
col=4,
alpha=0.2,
lwd=1)+
geom_text(aes(label=contagem),
vjust=1.6,
color=1,
size=3.5)+
ylab("") +
xlab("")
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:
<- data.frame(fator = factor(c("a","b","c","d","e","f"),
dados 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:
ggplot(dados, aes(x="", y=contagem, fill=fator))+
geom_bar(width = 1, stat = "identity", col='white', alpha=0.5)+
coord_polar("y", start=0)
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:
<- data.frame(x = rep(c('a','b','c','d'),50),
dados 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
:
library(gridExtra)
<- ggplot(data=df, mapping = aes(x=y))+
g1 geom_density(col=2, fill=2, alpha=0.3)
<- ggplot(data=df, mapping = aes(x=y))+
g2 geom_histogram(col=6, fill=6, alpha=0.3)
<- ggplot(data=df, mapping = aes(x=x,y=y,col=z))+
g3 geom_point(alpha=0.5)+
geom_smooth(col=1)
<- ggplot(data=df, mapping = aes(x=z,y=y,col=z)) +
g4 geom_boxplot(col=c(3,4),
fill=c(3,4),
alpha=0.3)
grid.arrange(g1,g2,g3,g4,nrow=2,ncol=2)
O pacote tem uma variedade de temas:
library(ggplot2)
<- ls("package:ggplot2")
temas <- grep('theme_', temas)
ind temas[ind[]]
## [1] "register_theme_elements" "reset_theme_settings"
## [3] "theme_bw" "theme_classic"
## [5] "theme_dark" "theme_get"
## [7] "theme_gray" "theme_grey"
## [9] "theme_light" "theme_linedraw"
## [11] "theme_minimal" "theme_replace"
## [13] "theme_set" "theme_test"
## [15] "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
:
<- sample(nrow(diamonds),4500,replace = F)
ind
<-
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)
<-
graf2 ggplot(data=diamonds[ind,], aes(x=table,y=depth,col=cut))+
geom_point(alpha=0.3)+
geom_smooth(method='lm',se=F, col=1)+
facet_wrap(~clarity)+
theme_light()+
theme(legend.position = 'none')
ggplotly(graf2)
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.