1 Apresentando a função ggplot

O “gg” no ggplot () é uma abreviatura de The Grammar of Graphics, um livro de Leland Wilkinson, dos quais o ggplot2 é derivado. A gramática de gráficos descreve o método de quebrar gráficos em elementos e construir cada elemento em uma série de camadas para controlar a representação visual. Segundo Hadley Wickham, a gramática de gráficos é descrita da seguinte maneira: “Em suma, a gramática nos diz que um gráfico estatístico é um mapeamento de dados para atributos estéticos (cor, forma e tamanho) de objetos geométricos (pontos, linhas, barras). O gráfico também pode conter transformações estatísticas e múltiplas facetas para diferentes subconjuntos dos dados. É a combinação de todas essas camadas que forma seu gráfico estatístico”. Deste modo, os gráficos no ggplot2 são construídos por meio da adição de camadas. Cada camada, grosso modo, é composta de:

  • Uma base de dados (um data.frame, preferencialmente no formato long);

  • Atributos estéticos (aesthetics);

  • Objetos geométricos;

  • Transformações estatísticas;

  • Facetas; e,

  • Demais ajustes.

Pacotes necessários:

library(ggplot2)
library(stats)
library(gridExtra)
library(ggthemes)
library(magrittr)
library(knitr)
library(dplyr)
library(devtools)
library(geojson)
library(readxl)

1.1 O operador pipe %>%

Este é um operador incrivelmente útil, pois torna dispensável a escrita de comandos multi-operacionais e permite “desfragmentar” as funções de um comando em partes. Isso torna o código mais fácil para escrever e para ler. O operador pipe leva a função do lado esquerdo e a carrega para a função do lado direito. O operador, literalmente, deixa a primeira função como argumento da função seguinte.

x <- c(1, 2, 3, 4)
x %>% sum %>% sqrt
## [1] 3.162278
sqrt(sum(x))
## [1] 3.162278

ou seja, first(x) %>% second() second(first(x))

2 Construindo um gráfico

O símbolo + é a chave para a construção de gráficos sofisticados do ggplot2. Ele permite uma forma simple até fique de forma mais elaborada, verificando seu trabalho em cada etapa. Temos que aprender a controlar os 5 componentes para construção de gráficos:

  • data: Um dataset que irá sobrescrever o plot default;
  • aesthetic mapping: A estética, atributos na função aes() function;
  • geom_: O nome do objeto geométrico a ser utilizado. Pode ter argumentos adicionais;
  • stat_: Transformação estatística a ser utilizada (estatísticas resumo);
  • position adjustments: O método utilizado para ajuste de objetos sobrepostos ao gráfico.

A primeira coisa a se fazer quando se utiliza o ggplot é mapear os dados.

  • ggplot(conjunto dos dados,aes())

No exemplo abaixo estamos utilizando os dados “mpg”(conjunto de dados sobre a economia de combustível dos modelos de carros populares em 1999 e 2008, EUA) e o mapeamento estético da variável “displ” (engine displacement, in litres) no eixo X, e da variável “hwy” (highway miles per gallon) no eixo Y.

ggplot(data=mpg, aes(x=displ, y=hwy)) 

A primeira camada é adicionar um objeto geométrico. Neste exemplo, estamos informando ao ggplot que queremos adicionar o ponto como objeto geométrico.

ggplot(data=mpg, aes(x=displ, y=hwy)) + geom_point()

Observação:

– A função aes () é o “como” - como os dados são armazenados, como os dados são divididos.

– O geom é o “que” - como os dados se parecem. Estes são objetos geométricos armazenados em camadas subsequentes.

2.0.0.0.0.1 NÃO ENTENDI NADA

2.1 Data

Todo layer deve ter algum dado associado. Os dados - data frame adequadamente formatado (colunas são variáveis e linhas as observações) ggplot2 transforma o data frame em visualização os dados em cada layer não podem ser os mesmos (útil para juntar múltiplos datasets em um único plot)

Cada camada deve ter alguns dados associados a ele, e esses dados devem estar em um data frame.

Os dados em cada camada não precisam ser iguais, e muitas vezes é útil combinar vários conjuntos de dados em um único argumento. Para ilustrar essa ideia, vamos gerar dois novos conjuntos de dados relacionados ao conjunto de dados mpg.

#criando dois novos datasets a partir de mpg
mod <- loess(hwy ~ displ, data = mpg)
grid <- data_frame(displ = seq(min(mpg$displ), max(mpg$displ), length = 50))
grid$hwy <- predict(mod, newdata = grid)
#isolando variáveis muito distantes do valor predito
std_resid <- resid(mod) / mod$s 
outlier <- filter(mpg, abs(std_resid) > 2)
#Gráfico dos dados (scaterplot), a linha suavizada e as anotções de outliers
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_line(data = grid, colour = "blue", size = 1.5) +
geom_text(data = outlier, aes(label = model))

Neste exemplo, cada camada usa um conjunto de dados diferente. Poderíamos usar o mesmo gráfico de outra maneira, omitindo o conjunto de dados padrão e especificando um conjunto de dados para cada camada:

#uma variação na definição do dataset inicial
ggplot(mapping = aes(displ, hwy)) +
geom_point(data = mpg) +
geom_line(data = grid) +
geom_text(data = outlier, aes(label = model))

– os labels dos outliers estão sobrepostos, mas podem ser ajustados.

– observa que foi explicitado “data =” nos layers , mas não no ggplot(). Isto é devido a diferença de ordem dos argumentos.

2.2 Aesthetic mapping

O aesthetic mappings, definido com aes (), descreve como as variáveis estarão dispostas no gráfico. Segue a sequencia aes(x = displ, y = hwy, colour = class), podemos utilizar “colour” ou “color”.

Por exemplo, tem-se o mapeamento: x-position como displ, y-position como hwy, and colour como class, então:

a1<-aes(x = displ, y = hwy, colour = class) 
#ou
a2<-aes(displ, hwy, colour = class)

Aesthetic mappings pode ser especificado no ggplot() inicial, em layers individuais ou combinando os dois. Nos exemplos abaixo, todos os comandos criam o mesmo gráfico.

b1<-ggplot(mpg, aes(displ, hwy, colour = class)) +
geom_point()
b2<-ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class))
b3<-ggplot(mpg, aes(displ)) +
geom_point(aes(y = hwy, colour = class))
b4<-ggplot(mpg) +
geom_point(aes(displ, hwy, colour = class))
gridExtra::grid.arrange(b1,b2,b3,b4,nrow=2,ncol=2)

Dentro de cada layer é possível adicionar, sobrescrever ou remover definições

Operação Layer aesthetics Resultado
Add aes(colour = cyl) aes(mpg, wt, colour = cyl)
Override aes(y = disp) aes(mpg, disp)
Remove aes(y = NULL) aes(mpg)

Exemplo:

p1=ggplot(mpg, aes(displ, hwy, colour = class)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE) +
theme(legend.position = "none")
p2=ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class)) +
geom_smooth(method = "lm", se = FALSE) +
theme(legend.position = "none")
gridExtra::grid.arrange(p1,p2, ncol=2)

2.3 Geom

Geometria, geoms controla o tipo de gráfico que esta sendo criado, ou seja, definem qual forma geométrica será utilizada para a visualização dos dados no gráfico. Como já vimos, a função geom_point() gera gráficos de dispersão transformando pares (x,y) em pontos. Veja a seguir outros geoms bastante utilizados:

  • geom_line: para retas definidas por pares (x,y)
  • geom_abline: para retas definidas por um intercepto e uma inclinação
  • geom_hline: para retas horizontais
  • geom_boxplot: para boxplots
  • geom_histogram: para histogramas
  • geom_density: para densidades
  • geom_area: para áreas
  • geom_bar: para barras

2.4 Stat

As transformações estatísticas, ou stat, transformam os dados, geralmente em medidas resumo. Geralmente são utilizado em geoms. Os mais importantes são:

  • stat_bin(): geom_bar(), geom_freqpoly(), geom_histogram()

  • stat_bin2d(): geom_bin2d()

  • stat_bindot(): geom_dotplot()

  • stat_binhex(): geom_hex()

  • stat_boxplot(): geom_boxplot()

  • stat_contour(): geom_contour()

  • stat_quantile(): geom_quantile()

  • stat_smooth(): geom_smooth()

  • stat_sum(): geom_count()

Observação: Algumas transformações estatísticas não são geradas por funções geom_.

Existem duas formas de usar stat. Pode-se adicionar a função stat_() e sobrescrever o geom default, ou adicionar uma função geom_() e sobrescrever a função stat default. Por exemplo,

Exemplo com variáveis discretas:

p1=ggplot(mpg, aes(trans, cty)) +
geom_point() +
stat_summary(geom = "point", fun.y = "mean", colour = "red", size = 4)+ guides(fill=guide_legend(title=""),colour=guide_legend(title=""))+ theme(plot.title = element_text(hjust = 0.5))+ theme(plot.title = element_text(size=10), axis.text.x = element_text(angle=90, hjust=1, size=10),axis.title.x = element_text(size=10), axis.title.y = element_text(size=10))
p2=ggplot(mpg, aes(trans, cty)) +
geom_point() +
geom_point(stat = "summary", fun.y = "mean", colour = "red", size = 4)+ guides(fill=guide_legend(title=""),colour=guide_legend(title=""))+ theme(plot.title = element_text(hjust = 0.5))+ theme(plot.title = element_text(size=10), axis.text.x = element_text(angle=90, hjust=1, size=10),axis.title.x = element_text(size=10), axis.title.y = element_text(size=10))
gridExtra::grid.arrange(p1,p2, ncol = 2)

Exemplo com uma variável contínua no eixo X:

#stat_summary operates on unique x
p1 = ggplot(mpg, aes(displ, cty)) + geom_point() +
stat_summary(geom = "point", fun.y = "mean", colour = "red", size=4) 
p2 = ggplot(mpg, aes(displ, cty)) + geom_point() +
geom_point(stat = "summary", fun.y = "mean", colour = "red")
gridExtra::grid.arrange(p1,p2, ncol = 2)

#str(mpg)
#table(mpg$displ)

2.5 Position adjustments

Os ajustes de posicionamento formatam os elementos em um layer

dplot <- ggplot(diamonds, aes(color, fill = cut)) +
xlab(NULL) + ylab(NULL) + theme(legend.position = "none")# position 
p1=dplot + geom_bar()
p2=dplot + geom_bar(position = "fill")
p3=dplot + geom_bar(position = "dodge")
gridExtra::grid.arrange(p1, p2,p3, ncol = 3)

3 Exemplos usando o ggplot2()

3.1 Gráfico de Barras

Exemplos usando a função ggplot e seus componentes:

ggplot(mpg,aes(as.factor(cyl)))+geom_bar()

b1<-ggplot(mpg,aes(as.factor(cyl)))+ geom_bar(color="deepskyblue",size=1,fill="deepskyblue4",alpha=0.5)
b2<-ggplot(mpg,aes(as.factor(year),fill=as.factor(cyl)))+geom_bar()
gridExtra::grid.arrange(b1, b2, ncol = 2)

ggplot(mpg,aes(as.factor(cyl),fill=as.factor(year)))+geom_bar()+
ggtitle("Contagem de carros com diferentes número de cilindros")+
xlab("Número de Cilindros") + ylab("Contagem")+theme(legend.position="bottom")

ggplot(mpg,aes(x=as.factor(cyl)))+geom_bar(color="red",size=1,fill="pink")+facet_wrap(~year)

3.1.0.0.0.1 PODE TIRAR?
theme_set(theme_bw(base_size = 14))
ggplot(mpg,aes(as.factor(cyl),fill=as.factor(year)))+geom_bar()+
ggtitle("Contagem de carros com diferentes número de cilindros")+
xlab("Número de Cilindros") + ylab("Contagem")+theme(legend.position="bottom")+ 
theme(legend.text = element_text(face = "bold"))+
guides(fill=guide_legend(title="Anos"))+scale_fill_brewer(palette="Set1")

3.2 Gráficos de Pontos

O geom_jitter é um atalho conveniente para geom_point(position = “jitter”). O comando adiciona uma pequena quantidade de variação aleatória à localização de cada ponto, e é uma forma útil de lidar com o overplottig (excesso de pontos em uma mesma localidade) causado por dados discretos.

mpg$year=as.factor(mpg$year)
mpg$cyl=as.factor(mpg$cyl)
ggplot(mpg,aes(year,displ))+geom_jitter()

p1<-ggplot(mpg,aes(year,displ))+geom_jitter(width = 0.4,size=5,color="red")
p2<-ggplot(mpg,aes(year,displ,color=year))+geom_jitter(width=0,size=4)+coord_flip()
gridExtra::grid.arrange(p1, p2, ncol = 2)

p3<-ggplot(mpg,aes(year,displ,color=cyl))+geom_jitter(size=4,width = 0.2)+ scale_colour_brewer(palette="Spectral")
p4<-ggplot(mpg,aes(year,displ,color=cyl))+geom_jitter(size=4,width = 0.2)+ scale_colour_brewer(palette="BrBG") #OrRd,Dark2,BrBG
p5<-ggplot(mpg,aes(year,displ,color=cyl,shape=drv))+geom_jitter(size=4,width = 0.2,alpha=0.8)+ scale_colour_brewer(palette="BrBG")
gridExtra::grid.arrange(p3, p4, p5, ncol = 3)

3.3 Gráficos de Dispersão

ggplot(mpg,aes(x=displ,y=hwy))+geom_point()

3.3.0.0.0.0.1 ACHEI PEQUENO

d1<-ggplot(mpg,aes(x=cty,y=hwy,size=displ,shape=year,color=class))+geom_point(alpha=0.5)
d2<-ggplot(mpg,aes(x=cty,y=hwy,size=displ,color=class,shape=year))+
geom_point(alpha=0.5)+ scale_colour_brewer(palette="OrRd")
gridExtra::grid.arrange(d1, d2, ncol = 2)

ggplot(mpg,aes(x=cty,y=hwy,size=displ,shape=year,color=class))+geom_point(alpha=0.5)+
facet_wrap(~cyl)

3.4 Densidades

ggplot(mpg,aes(displ))+geom_density(fill = "darkred")

d3<-ggplot(mpg,aes(displ,color=year))+geom_density()
d4<-ggplot(mpg,aes(displ,color=year))+geom_density(alpha=0.7,fill="white",size=1)+
scale_colour_brewer(palette="Set1")
gridExtra::grid.arrange(d3, d4, nrow = 2)

ggplot(mpg,aes(displ,fill=year))+geom_density(alpha=0.4,color="black")+facet_wrap(~cyl)

dados1=mpg %>% filter(cyl!=5)
ggplot(dados1,aes(displ,fill=year))+geom_density(alpha=0.4,color="black")+facet_wrap(~cyl)

theme_set(theme_minimal())
ggplot(dados1,aes(displ,fill=year))+geom_density(alpha=0.4,color="black")+facet_wrap(~cyl)

theme_set(theme_classic())
ggplot(dados1,aes(displ,fill=year))+geom_density(alpha=0.4,color="black")+facet_wrap(~cyl)

theme_set(theme_economist())

ggplot(dados1,aes(displ,fill=year))+geom_density(alpha=0.4,color="black")+facet_wrap(~cyl)

theme_set(theme_grey())
ggplot(dados1,aes(displ,fill=year))+geom_density(alpha=0.4,color="black")+
facet_wrap(~cyl)+theme_hc()+ scale_colour_hc()

3.5 Histogramas

h1<-ggplot(mpg,aes(displ))+geom_histogram()
h2<-ggplot(mpg,aes(displ))+geom_histogram(binwidth = 0.4,color="black",fill="red")
gridExtra::grid.arrange(h1, h2, ncol = 2)

p<-ggplot(mpg,aes(displ,color=cyl,fill=cyl))+geom_histogram(binwidth = 0.6,alpha=0.8)+facet_wrap(~year);p

ggplot(mpg,aes(displ))+geom_histogram(binwidth = 0.6,color="black",fill="red")+
theme_calc()+ scale_colour_calc()+facet_wrap(~year+cyl)

3.6 Box plots

ggplot(data=mpg, aes(x=class, y=hwy)) + geom_boxplot(aes(fill = class))

p <- ggplot(mpg, aes(class, hwy))
p + geom_boxplot()

p + geom_boxplot() + geom_jitter(width = 0.2)

p + geom_boxplot() + coord_flip()

p + geom_boxplot(notch = TRUE)

p + geom_boxplot(varwidth = TRUE)

p + geom_boxplot(fill = "white", colour = "#3366FF")

p + geom_boxplot(outlier.colour = "red", outlier.shape = 1)

p + geom_boxplot(aes(colour = drv))