Gramática Gráficos e ggplot2

Gramática Gráficos e ggplot2

(Parte 1 de 2)

Gramática dos Gráficos e ggplot2

Allan Robert

Minicurso. Recife-PE. Universidade Federal Rural de Pernambuco all_robert02@yahoo.com.br

6 de dezembro de 2017

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 1 / 31

Objetivo

É o objetivo deste curso:

Mostrar um forma de pensar a construção de graficos a partir da gramática de gráficos;

Aplicar esta teoria usando o pacote ggplot2 e suas extensões implementados no software R.

Desenvolver grafícos diversos que fujam do tradicional.

Contrubuir para escrita de textos acadêmicos, em termos de melhoria de qualidade gráfica.

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 2 / 31

Questionamentos

O que é um gráfico? Como descrevemos sucintamente um gráfico? E como podemos criar o gráfico que descrevemos?

Uma maneira de responder a essas questões é desenvolver uma gramática: "os princípios fundamentais ou regras de uma arte ou ciência"

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 3 / 31

Gramática dos gráficos

Gramática significa, em geral, regras para a arte e a ciência.

No contexto da analise gráfica, são regras para a construção de gráficos matemáticos e sua representação estética.

Wilson , Anand e Grossman (2005) escreveram um livro entitulado "The Grammar of Graphics"propondo uma gramática que pode ser usada para descrever e construir uma ampla gama de gráficos estatísticos a partir de múltiplas camadas de informações.

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 4 / 31

Gramática dos gráficos

A gramática dos gráficos na prática é uma maneira de se pensar como construir gráficos ficando claro cada passo que é realizado para construção do mesmo. Desta teoria um gráfico pode ser construido nas seguintes camadas:

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 5 / 31

Descrevendo as camadas

As camadas são descritas como:

Data: Os dados brutos.

Aesthestics: mapeamento de dados para propriedades estéticas (cor, forma, tamanho,etc.);

Geometries: forma de visualização (pontos, linhas, barras, etc.); Facets: Uso de Múltiplos gráficos categorizados.

Statistics: Transformações estatísticas usadas (identidade, média, variância, suavizações, regressão linear, etc);

Coordinates: Mapeamento dos dados no sistema de coordenadas de um plano.

Theme: Temas pradronizados de cores, tamanhos, letras, etc.

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 6 / 31 ggplot2 - O que? e porque usar? ggplot2 é um pacote do software R baseado na gramática de gráficos escrita por Wilkinson(2005).

Possui um conjunto simples de princípios fundamentais e muito poucos casos especiais para construção de gráficos;

Ajuda a produção de gráficos de qualidade de publicação em poucas linhas de comandos;

Auxilia a concentração na criação de um gráfico que melhor revele as mensagens contidas em seus dados.

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 7 / 31

Conjuntos de dados

Trabalharemos com dois conjuntos de dados:

1 lincoln_weather: Dados metereologicos diarios da cidade de Lincoln, capital de Nebraska- EUA do ano de 2016.

2 rain: Mostra medidas categorizadas de precipitação da ilha vulcânica

Alofi.

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 8 / 31

Primeiro Gráfico simples - Scatterplot library(ggplot2) library(ggridges) # onde está o conjunto lincoln_weather tmemax=ggplot(lincoln_weather, aes(x = Mean Temperature [F],y = Max Temperature [F])) tmemax+geom_point(colour = "red", size = 3,shape = 21, fill = "blue")

Max T emper ature [F]

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 9 / 31

Mapeando meses por Estações

# Estações refentes ao hemisfério norte. Est=c(rep("Inverno",60),rep("Primavera",(153-60)),rep("Verão",(241-153)),rep("Outono",(336-241)), rep("Inverno",(366-336))) ;Estações=as.factor(Est) tmemaxe=ggplot(lincoln_weather, aes(x = Mean Temperature [F],y = Max Temperature [F],color=Estações)) tmemaxe+geom_point()

Max T emper ature [F] EstaçõesInvernoOutonoPrimaveraVerão

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 10 / 31

Acrescentando um modelo linear por estação tmemaxe+geom_point() + geom_smooth(method = 'lm')

Max T emper ature [F] EstaçõesInvernoOutonoPrimaveraVerão

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 1 / 31

Acrescentando um modelo linear geral + Regressão Quantílica tmemax+geom_point(aes(color = Estações)) + geom_smooth(method = 'lm') +geom_quantile(color="red")

Max T emper ature [F] EstaçõesInvernoOutonoPrimaveraVerão

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 12 / 31

Para uma variável Quantitativa - Opções básicas Observando: - Histograma, Densidade, Dotplot e Poligono de Frequência Aplicando a velocidade média em milha por hora.

library(gridExtra) # Para ver diversos gráficos. tme=ggplot(lincoln_weather, aes(x = Mean Wind Speed[MPH])) g1 <- tme+ geom_histogram() g2 <- tme+ geom_density(alpha=0.5,color="darkblue", fill="lightblue") g3 <- tme+ geom_dotplot(color="blue",shape=21) g4 <- tme+ geom_freqpoly(color="brown4") grid.arrange(g1, g2, g3,g4)

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 13 / 31

Para uma variável categórica - Opções básicas

Observando: - Colunas, Barras, Coluna Única com proporções e Setores.

Aplicando preciptação de chuva na ilha Alofi.

library(markovchain) # onde esta os dados de chuva da ilha vulcância Alofi r1=ggplot(rain, aes(x =rain)) # dados de contagem r2=ggplot(rain, aes(x ="",fill=rain)) # dados proporção g1 <- r1+ geom_bar() g2 <- r1+ geom_bar(fill=c("darkturquoise","firebrick2","gold1"))+coord_flip() g3 <- r2 + geom_bar(position="fill", width=1) g4 <- r2 + geom_bar(position="fill", width=1) + coord_polar(theta="y") grid.arrange(g1, g2, g3, g4)

count

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 14 / 31

Para uma variável contínua em categorias - Opções básicas

Observando: - Densidades, Dotplots, Box-plots e violino-plot. Média de velocidade do vento por estação.

tmest=ggplot(lincoln_weather, aes(y=Mean Wind Speed[MPH],x=Estações,fill=Estações)) tmest2=ggplot(lincoln_weather, aes(x=Mean Wind Speed[MPH],fill=Estações)) g1 <- tmest2+ geom_density(alpha=0.5) g2 <- tmest+ geom_dotplot(binaxis = "y",stackdir = "center") g3 <- tmest+ geom_boxplot() g4 <- tmest+ geom_violin() grid.arrange(g1, g2, g3, g4) density

EstaçõesInvernoOutonoPrimaveraVerão 0 10 20

Inverno Outono Primavera VerãoEstações

Mean Wind Speed[MPH] EstaçõesInvernoOutonoPrimaveraVerão

Inverno Outono Primavera VerãoEstações

Mean Wind Speed[MPH] EstaçõesInvernoOutonoPrimaveraVerão 0

Inverno Outono Primavera VerãoEstações

Mean Wind Speed[MPH] EstaçõesInvernoOutonoPrimaveraVerão

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 15 / 31

Trabalhando com Escalas - Limites e Tranformações Voltando ao primeiro gráfico. Limites e transformações implementadas.

gra1=tmemax+geom_point(colour = "red", size = 3, shape = 21, fill = "blue") g1 <- gra1 + scale_x_continuous(limits = c(0, 75)) # limitado de 0 a 75 os valores de x g2 <- gra1 + scale_y_continuous(limits = c(25, 100)) # limitado de 25 a 100 os valores de y g3 <- gra1 + scale_y_log10()# Aplicando escala logaritma na base 10 em y g4 <- gra1 + scale_x_sqrt()# Aplicando raiz quadrada em x grid.arrange(g1, g2, g3, g4)

Max T emper ature [F]

Max T emper ature [F]

Max T emper ature [F]

255075Mean Temperature [F]

Max T emper ature [F]

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 16 / 31

Trabalhando com Escalas - Cores

Relação entre escalas e cores (fil) a dados discretos e contínuos.

r1f=ggplot(rain, aes(x =rain,fill=rain)) # dados de contagem + fill tmef=ggplot(lincoln_weather, aes( Mean Wind Speed[MPH])) g1 <- r1f+ geom_bar() + scale_fill_brewer(palette = "Blues") # Paleta azul azuis g1 <- r1f+ geom_bar() + scale_fill_grey(start = 0.8, end = 0.2, na.value = "red") # Paleta cinza g3 <- tmef+geom_dotplot(aes(fill=..x..))+scale_fill_gradient(low="cadetblue1", high="red") g4 <- tmef+geom_histogram(aes(fill=..x..))+scale_fill_distiller(palette = "Spectral") grid.arrange(g1, g2,g3,g4) count

count

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 17 / 31

Trabalhando com Escalas - Formato e tamanho

Relação entre escalas formatos e tamanhos a dados discretos e contínuos.

tmemaxE=ggplot(lincoln_weather, aes(x = Mean Temperature [F],y = Max Temperature [F],shape=Estações)) tmemaxS=ggplot(lincoln_weather, aes(x = Mean Temperature [F],y = Max Temperature [F], size=Min Temperature [F])) g1 <- tmemaxE+geom_point(aes(color=Estações))+scale_shape() g2 <- tmemaxS+geom_point(aes(color=Estações)) +scale_size() grid.arrange(g1, g2)

Max T emper ature [F] EstaçõesInvernoOutonoPrimaveraVerão

Max T emper ature [F] Min Temperature [F]−2502550

EstaçõesInvernoOutonoPrimaveraVerão Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 18 / 31

Coordenadas

Dados de chuva categorizados.

r1f=ggplot(rain, aes(x =rain,fill=rain)) # dados de contagem + fill g1 <- r1f + geom_bar() +coord_cartesian(ylim=c(0,600)) # limitado y 0 a 500 Cord. Carteziana g2 <- r1f +geom_bar() + coord_fixed(ratio = 1/150) # Razão entre escalas y/x g3 <- r1f +geom_bar() + coord_flip() # girando (flip) as coordenadas g4 <- r1f +geom_bar() + coord_polar(theta = "x", direction=1) # Coordenadas polares grid.arrange(g1, g2, g3, g4) count

rain

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 19 / 31

Faces - Saída dividia por categoria Divisão da saída gráfica em função de outra variável.

rtemp=data.frame(temp_max=lincoln_weather$Max Temperature [F], temp_med=lincoln_weather$Mean Temperature [F],Estações=Estações,Meses=lincoln_weather$Month) t45=ifelse(rtemp$temp_med>=45," Maior ou igual à 45 ","Menor que 45") ; rtemp$t45=t45 tememax=ggplot(rtemp, aes(x = temp_max, y= temp_med,group=t45)) g1 <- tememax +geom_point(aes(color=Estações))+facet_grid(Estações ~ .) # Em linhas g2 <- tememax +geom_point(aes(color=Estações))+facet_grid(.~Estações) # Em colunas g3 <- tememax +geom_point(aes(color=Estações))+facet_grid(t45~ Estações) # linhas e colunas g4 <- tememax +geom_point(aes(color=Estações))+facet_wrap(~Estações) # retângulo

Inverno Outono Primavera Verão

Maior ou igual à 45

75 temp_max temp_med EstaçõesInvernoOutonoPrimaveraVerão

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 20 / 31

Faces - usando pacote ggridges

Divisão da saída gráfica usando o pacote ggridges library(ggridges) ggplot( lincoln_weather, aes(x = Mean Temperature [F], y = Month)) + geom_density_ridges_gradient(aes(fill = ..x..), scale = 3, size = 0.3) + scale_fill_gradientn(colours = c("#0D0887FF", "#CC4678FF", "#F0F921FF"),name = "Temp. [F]" )+ labs(title = 'Temperatura em Lincoln NE',x='Temperatura Média',y='Meses' )

December November October September August July June May April March February January

Temperatura em Lincoln NE

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 21 / 31

Temas personalizados

Há diversos temas pré-definidos. Vejamos alguns tmemaxe=ggplot(lincoln_weather, aes(x = Mean Temperature [F],y = Max Temperature [F],color=Estações)) g1 <- tmemaxe+geom_point() + theme_bw() g2 <- tmemaxe+geom_point() + theme_classic() g3 <- tmemaxe+geom_point() + theme_dark() g4 <- tmemaxe+geom_point() + theme_light() grid.arrange(g1, g2, g3, g4)

Max T emper ature [F] EstaçõesInvernoOutonoPrimaveraVerão 25

Max T emper ature [F] EstaçõesInvernoOutonoPrimaveraVerão

Max T emper ature [F] EstaçõesInvernoOutonoPrimaveraVerão 25

Max T emper ature [F] EstaçõesInvernoOutonoPrimaveraVerão

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 2 / 31

Temas personalizados com o pacote ggthemes library(ggthemes) g1 <- tmemaxe+geom_point() + theme_fivethirtyeight() # fivethirtyeight g2 <- tmemaxe+geom_point() + theme_igray() # invertido branco e cinza g3 <- tmemaxe+geom_point() + theme_wsj() # Wall street journal g4 <- tmemaxe+geom_point() + theme_stata() # software stata grid.arrange(g1, g2, g3, g4)

0 25 50 75 Estações Inverno Outono Primavera Verão

Max T emper ature [F] EstaçõesInvernoOutonoPrimaveraVerão

Estações Inverno Outono Primavera Verão

Max T emper ature [F]

Estações Inverno Outono Primavera Verão Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 23 / 31

Novos gráficos com GGally

Matriz de correlação library(GGally) lincoln_weather$Est=Estações # atribuindo variável Est com estações aos dados gpar<- ggpairs(lincoln_weather, mapping = aes(color = Est), columns = 2:4,columnLabels = names(lincoln_weather)[2:4]) gpar

Cor : 0.968Inverno: 0.899Outono: 0.919Primavera: 0.895Verão: 0.889 Cor : 0.87Inverno: 0.596Outono: 0.657Primavera: 0.594Verão: 0.556

Cor : 0.966Inverno: 0.887Outono: 0.901Primavera: 0.89Verão: 0.873

Max Temperature [F]Mean Temperature [F]Min Temperature [F]

Max T emper ature [F]

Mean T emper ature [F]

Min Temper ature [F]

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 24 / 31

Novos gráficos com GGally

Matriz de correlação acrescentando uma variável categórica ggpairs(lincoln_weather, mapping = aes(color = Est), columns = c(2,3,4,25), columnLabels = names(lincoln_weather)[c(2,3,4,25)])

Cor : 0.968Inverno: 0.899Outono: 0.919Primavera: 0.895Verão: 0.889 Cor : 0.87Inverno: 0.596Outono: 0.657Primavera: 0.594Verão: 0.556

Cor : 0.966Inverno: 0.887Outono: 0.901Primavera: 0.89Verão: 0.873

Max Temperature [F]Mean Temperature [F]Min Temperature [F]EstMax T emper ature [F]

Mean T emper ature [F]

Min Temper ature [F]

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 25 / 31

Alicando zoom usando ggforce

Voltando a primeiro gráfico aplicando zoom em Primavera tmemaxe=ggplot(lincoln_weather, aes(x = Mean Temperature [F],y = Max Temperature [F],color=Est)) tmemaxe+geom_point()+facet_zoom(x = Est == "Primavera")

Mean Temperature [F]

Max T emper ature [F] Est InvernoOutonoPrimaveraVerão

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 26 / 31

Introduzindo equações com ggpmisc

Voltando a primeiro gráfico aplicando equação e R2 ajustado library(ggpmisc) formula <- lm(lincoln_weather$Max Temperature [F] ~ lincoln_weather$Mean Temperature [F]) tmemax+ geom_point() + geom_smooth(method = "lm") + stat_poly_eq(aes(label = paste(..eq.label..,..adj.r.label.., sep = "~~~~")), formula = formula, parse = TRUE) + theme_bw()

Max T emper ature [F]

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 27 / 31

Margens com Densidades ou histogramas pelo ggExtra

Voltando a primeiro gráfico aplicando histograma ou densidade nas margens library(ggExtra) g1=tmemax+geom_point(color= "pink", size = 2,shape = 21, fill ="cadetblue1") ggMarginal(g1, size = 2, type = "histogram", col = "blue", fill = "darkseagreen1")

Max T emper ature [F]

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 28 / 31

Considerações

Conclusões com relação ao ggplot2:

Aplica de maneira prática e eficaz a gramática dos gráficos; É Gratuito e tem comandos de fácil aplicação;

Há diversos gráficos básicos e outras extensões com tutuoriais disponíveis online;

São elegantes e atrativos ao olhar;

Existe uma comunidade bem inclinada a construção de novas extensões sob a mesma idéia da gramática dos gráficos;

Extraem informações úteis inclusive para exploração das técnicas existentes.

Allan Robert (UFS-UFRPE) ggplot2 6 de dezembro de 2017 29 / 31

(Parte 1 de 2)

Comentários