GGPLOT( ) é o Puro Creme dos Gráficos em R

Ok, o título é brega, mas eu tinha que chamar a atenção ao ggplot(). Embora já tenha falado do pacote ggplot2 em outros posts, a função ggplot() e todo seu poder de fogo mereciam um espaço inteiramente à eles. Aqui você vai aprender a fazer mais uma vez gráficos em barras, de dispersão, de linha, dentre outros, mas vai ver também várias formas de demonstrar a relação de 3 ou mais variáveis e de visualizar essas diferentes saídas. Como é um post mais específico e não tem aquele título para um objetivo específico, é possível que poucos o vejam. Se você está aqui, não feche a janela, sério, você não vai se arrepender. São só alguns minutinhos!

Para você já ter em mente, aqui você irá aprender a traçar gráficos simples de barras e de dispersão; traçar gráficos bidimensionais, podendo ainda pintar os pontos de diferentes cores de acordo com uma terceira variáveis (i.e. separando por grupos); traçar gráficos de duas variáveis, pintar os pontos de acordo com uma terceira variável e ainda dividir em painéis separados por uma quarta variável, ou seja, você poderá visualizar como 4 variáveis interagem entre si.

Primeiro, vamos carregar a biblioteca ggplot2 (talvez a mais popular no que diz respeito a gráficos no R) e a nossa base (que pode ser encontrada neste link aqui):

library(ggplot2)

diabetes = read.csv('diabetes.csv')

Agora, você precisa entender que o ggplot() requer basicamente dois argumentos: a base de dados que está sendo utilizada e as variáveis cujo gráfico será traçado. O nome da base de dados deve ser descrito depois de ‘data = ‘, enquanto as variáveis serão colocadas dentro de aes(), abreviação de aestheticsInicialmente, vamos traçar o gráfico de uma única variável, no caso Pregnancies. Desta forma teríamos o seguinte código:

ggplot(data=diabetes, aes(Pregnancies))

Porém, se você tentar executar o código acima, irá notar que o gráfico veio vazio. O ggplot() requer que você informe qual o tipo de gráfico que quer (dispersão, barras, etc.). Porém, a informação não é passada dentro do ggplot() e sim como se uma nova função fosse adicionada. Veja a seguir dois exemplos:

#grafico de barras
ggplot(data=diabetes, aes(Pregnancies))+geom_bar()

Alguns tipos de gráficos não são possíveis com uma única variável. Mas isso veremos daqui a pouco. Antes, vamos melhorar o gráfico acima, alterando os nomes dos eixos, colocando um título e mudando a cor das barras:

ggplot(data=diabetes, aes(Pregnancies))+geom_bar(fill="blue")+labs(x='Gravidez', y="Quantidade")+ggtitle("Exemplo 1")

Utilizamos então labs() para nomear os eixos, ggtitle() para dar um título e o argumento ‘fill=’ para preencher com a cor desejada (no caso azul, aka blue). Como o título ficou desalinhado, vamos alterar o alinhamento utilizando theme():

ggplot(data=diabetes, aes(Pregnancies))+geom_bar(fill="blue")+labs(x='Gravidez', y="Quantidade")+ggtitle("Exemplo 1")+theme(plot.title = element_text(hjust = 0.5))

Para ver outras possibilidades de tema, recomendo o Datanova.

Outro exemplo, modificando o fundo (atenção que a ordem dos temas altera a saída):

ggplot(data=diabetes,aes(Pregnancies))+geom_bar(fill="blue")+labs(x='Gravidez', y="Quantidade")+ggtitle("Exemplo 1")+
theme_grey()+theme(plot.title = element_text(hjust = 0.5))

Ok, agora você já entendeu o básico da construção de um gráfico no ggplot(), próximo passo é montar um gráfico com duas variáveis. Acredito que seja intuitivo que basta acrescentar uma variável ao aes(). Veja um exemplo em um gráfico de dispersão:

dev.off()
ggplot(data = diabetes, aes(Glucose, Age))+geom_point()

Novamente, podemos dar um tapa nesse layout:

ggplot(data = diabetes, aes(x=Glucose, y=Age))+labs(x="Glicose",y="Idade")+
ggtitle("Exemplo 2")+geom_point()+theme_grey()+theme(plot.title = element_text(hjust = 0.5))

Agora estou deixando claro qual a variável/eixo em cada argumento somente para que não haja confusão. Aconselho bastante. Bom, agora temos uma visão da relação da variável Idade com Glicose. Um clássico dos gráficos de dispersão é traçar uma linha que representa a regressão linear, só para que se tenha uma ideia do comportamento descrito. Vamos utilizar o geom_smooth():

ggplot(data = diabetes, aes(x=Glucose, y=Age))+labs(x="Glicose",y="Idade")+
ggtitle("Exemplo 2")+geom_point()+theme_grey()+theme(plot.title = element_text(hjust = 0.5))+geom_smooth(method = "lm")

Pelo gráfico, quanto mais velha for a pessoa, maior o índice de glicose. Claro, é uma relação bem fraca, os pontos estão muito dispersos. Mas já é uma coisa que pode ser melhor explorada pelo analista. Como você deve estar imaginando há outros métodos possíveis, como loessgam só para citar alguns. Aí vai do modelo que você quer “fitar” aqui.

Bom, agora você pode estar imaginando na possibilidade de incluir mais uma variável. Por exemplo, temos a relação entre glicose e idade, mas podemos querer identificar como esse relação se dá quando temos pessoas que já tiveram ao menos uma gravidez contra as demais. Para isso, vamos primeiro criar uma variável chamada fl_gravidez para separar quem já teve ao menos uma gravidez e em seguida traçar o gráfico pintando os pontos de acordo com essa nova variável (atenção para ‘color=fl_gravidez‘):

# Cria variavel fl_gravidez
diabetes$fl_gravidez = ifelse(diabetes$Pregnancies > 0, 1, 0)

# traça o grafico separando os pontos por cores de acordo com fl_gravidez
ggplot(data = diabetes, aes(x=Glucose, y=Age,color=fl_gravidez))+labs(x="Glicose",y="Idade")+
ggtitle("Exemplo 2")+geom_point()+theme_grey()+theme(plot.title = element_text(hjust = 0.5))

Como o R entendeu que fl_gravidez era uma variável numérica, contínua, tivemos o tipo de coloração separada de forma contínua. Podemos melhorar o gráfico transformando a variável fl_gravidez em fator:

ggplot(data = diabetes, aes(x=Glucose, y=Age,color=as.factor(fl_gravidez)))+labs(x="Glicose",y="Idade")+
ggtitle("Exemplo 2")+geom_point()+theme_grey()+theme(plot.title = element_text(hjust = 0.5))

Agora, vamos supor que você queira adicionar o Outcome para análise. Para isso, podemos separar em diferentes painéis, sendo um para indivíduos com Outcome = 1 e outro para indivíduos com Outcome = 0. Para isso, usamos o facet_wrap():

ggplot(data = diabetes, aes(x=Glucose, y=Age,color=as.factor(fl_gravidez)))+labs(x="Glicose",y="Idade")+
ggtitle("Exemplo 3")+geom_point()+theme_grey()+theme(plot.title = element_text(hjust = 0.5))+facet_wrap(~Outcome)

E agora você tem 4 variáveis em um único gráfico! Ou um painel de gráficos na verdade, o que não deixa de ser ótimo para análise exploratória!

Isso é só uma parte do que o ggplot() é capaz de fazer e como você pode ver, não é pouco. Veja a seguir mais uma série de gráficos feitos com esta função e que você pode adaptá-los para utilizar do jeito que lhe for conveniente (atenção: vou utilizar as bases iris mtcars que já vêm no R para melhorar os exemplos):

diabetes %>%
keep(is.numeric) %>%
gather() %>%
ggplot(aes(value)) +
facet_wrap(~ key, scales = "free") +
ggtitle("Histogramas de Todas Variaveis")+
geom_histogram()+
theme(plot.title = element_text(hjust = 0.5))

#boxplot simples
ggplot(data = iris, aes(x = Species, y = Sepal.Length, fill=Species))+geom_boxplot()+ylab("Sepal Length")+xlab("Species")

ggplot(data = iris, aes(x = Species, y = Sepal.Length))+
geom_boxplot()+
ggtitle("Exemplo de Boxplot com a Media")+
theme_classic()+
theme(plot.title = element_text(hjust = 0.5))+
stat_summary(fun.y=mean, geom="point", shape=15, size=3)

#legenda posicionada na parte de baixo

ggplot(data=mtcars, aes(x = gear, fill = as.factor(gear))) +
geom_bar() +
ggtitle("Exemplo Graf. de Barras")+
theme_gray()+
theme(legend.position="bottom")+
theme(plot.title = element_text(hjust = 0.5))

#retirando a legenda com guides()

ggplot(data=mtcars, aes(x = gear, fill = as.factor(gear))) +
geom_bar() +
ggtitle("Exemplo Graf. de Barras")+
theme_gray()+
theme(legend.position="bottom")+
theme(plot.title = element_text(hjust = 0.5))+
guides(fill = FALSE)

# separa por grupos de acordo com cyl

ggplot(data=mtcars, aes(x = gear, fill = as.factor(gear))) +
geom_bar() +
ggtitle("Exemplo Graf. de Barras")+
theme_gray()+
theme(legend.position="bottom")+
theme(plot.title = element_text(hjust = 0.5))+
facet_wrap(~cyl)

ggplot(data=mtcars, aes(x = gear, fill = as.factor(gear))) +
geom_bar() +
ggtitle("Exemplo Graf. de Barras")+
theme_gray()+
theme(legend.position="bottom")+
theme(plot.title = element_text(hjust = 0.5))+
facet_wrap(~cyl)+
theme(
plot.title = element_text(color="green", size=16, face="italic"),
axis.title.x = element_text(color="red", size=12, face="bold"),
axis.title.y = element_text(color="yellow", size=14, face="bold.italic")
)

# retira-se qlqr eixo utilizando element_blank()

ggplot(data=mtcars, aes(x = gear, fill = as.factor(gear))) +
geom_bar() +
ggtitle("Exemplo Graf. de Barras")+
theme_gray()+
theme(legend.position="bottom")+
theme(plot.title = element_text(hjust = 0.5))+
facet_wrap(~cyl)+
theme(
plot.title = element_text(color="green", size=16, face="italic"),
axis.title.x = element_blank(),
axis.title.y = element_text(color="yellow", size=14, face="bold.italic"))

ggplot(data=iris, aes(x=Sepal.Length, y=Sepal.Width)) +
geom_point() +
ggtitle("Exemplo com Reg Polinomial")+
theme(plot.title = element_text(hjust = 0.5))+
geom_smooth(method="loess")+
theme(
plot.title = element_text(color="blue", size=16, face="bold.italic"),
axis.title.x = element_text(color="darkgray", size=12, face="bold"),
axis.title.y = element_text(color="darkgray", size=12, face="bold"))

# grafico de dispersao, circulando determinado grupo ou area usando ggalt
library("ggalt")
ggplot(data=iris, aes(x=Sepal.Length, y=Sepal.Width)) +
geom_point() +
ggtitle("Exemplo Circulando Pontos")+
labs(x="Sepal Length", y="Sepal Width")+
theme(plot.title = element_text(hjust = 0.5))+
geom_encircle(aes(x=5, y=4),
data=diabetes,
color="blue",
size=1,
expand=0.04)

# grafico de pizza
ggplot(data=mtcars, aes(x="", y=cyl, fill=as.factor(cyl)))+
geom_bar(width = 1, stat = "identity")+coord_polar("y", start=0)

Enfim, essas são só algumas das possibilidades. Como disse anteriormente, é possível melhorar visualmente muitos destes gráficos. Aqui, tentei apenas demonstrar quais argumentos você precisa para modificar cada parte do gráfico. Espero que tenha feito bom proveito e podem ter certeza de que teremos uma Parte 2!

E se você gostou do post, não vá embora sem deixar uma curtida ou um comentário. Eu sei que não parece relevante, mas faz diferença para mim e custa pouco para você, vai… Se encontrou algum erro ou tem alguma sugestão, dúvida, elogio ou crítica, pode escrever nos comentários ou me enviar uma mensagem diretamente em Sobre o Estatsite. E visite também a conta do Twitter @EstatSite, costumo postar algumas coisas bem rapidinho por lá, geralmente são posts e códigos mais curtos ou compartilhamento de algo legal ou alguma reflexão.

Forte abraço e bons estudos!

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *