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)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))
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:
A primeira coisa a se fazer quando se utiliza o ggplot é mapear os dados.
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.
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.
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)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:
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)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)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)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")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)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)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()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);pggplot(mpg,aes(displ))+geom_histogram(binwidth = 0.6,color="black",fill="red")+
theme_calc()+ scale_colour_calc()+facet_wrap(~year+cyl)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))