Unidade 9 Gráficos com o ggplot2

9.1 Introdução

O pacote ggplot2 (Wickham and Chang 2016) permite mesmo aos usuários sem muito conhecimento de R a produzirem gráficos com aparência profissional. Mais do que isso, possibilita que os analístas de dados possam explorar e comunicar melhor as evidências existentes em um conjunto de dados, tornando seu trabalho como um todo mais robusto.

9.2 Gramática dos gráficos (Wilkinson 2005)

O pacote ggplot2 incorpora um conceito moderno sobre como constriur apresentações gráficas. Esse conceito está baseado na ideia de que um gráfico deve ser construído em camadas sucessivas, e tais camadas aos poucos vão dando forma a ideia a ser comunicada.

As camadas de um gráfico são (termo em inglês entre parênteses):

- dados (data)
- mapeamento visual (aesthetic mapping)
- geometria (geometric object)
- transformações (statistical transformations)
- escalas (scales)
- sistema de coordenadas (coordinate system)
- posição (position adjustments)
- faces (faceting)

Essa organização permite que elementos gráficos sejam combinados de maneira flexível, sejam refinados aos poucos partindo de ideias mais abstratas. Além do que a alteração de uma camada não compromete a consitências das demais. Por exemplo, mudar o símbolo ou a cor dos pontos.

Existem outros pacotes gráficos em R, alguns independentes mas outros que estendem ainda mais a abrangência do pacote ggplot2, como por exemplo:

 - Gráficos 3-D (pacote rgl)
 - Plotagem de grafos (pacote *igraph*)
 - Gráficos interativos (pacote *ggvis*)

Para essa sessão, a referência utilizada é o material do workshop “Introduction to R” realizado em Fevereiro/2017 pelo Research consulting for the Harvard community - Data Science Services - Harvard University, confeccionado principalmente por Ista Zahn.

9.3 Primeiro exemplo

9.3.1 Dados: “Housing prices

Fonte dos Dados [https://www.lincolninst.edu/subcenters/land-values/land-prices-by-state.asp]

#   Importe os dados (arquivo landdata-states-2016q1.xls).
housing <- read.csv("https://efsilvaa.github.io/IntroR/dados/landdata-states.csv")
head(housing[1:5])
##   State region    Date Home.Value Structure.Cost
## 1    AK   West 2010.25     224952         160599
## 2    AK   West 2010.50     225511         160252
## 3    AK   West 2009.75     225820         163791
## 4    AK   West 2010.00     224994         161787
## 5    AK   West 2008.00     234590         155400
## 6    AK   West 2008.25     233714         157458

9.3.2 ggplot2 VS Base

Comparado com o pacote base, ggplot2 :

   - comandos com mais texto para gráficos simples
   - porém mais comandos mais simples para gráficos complexos
   - dados sempre devem estar em um `data.frame`
   - usa uma sistemática diferente para adicionar os elementos gráficos
   

Como já vimos, para montar um histograma com o pacote base:

hist(housing$Home.Value)

Já usando ggplot2:

library(ggplot2) #não esqueça de carregar e instalar o pacote 

ggplot(housing, aes(x = Home.Value)) +    
       geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Obs: ‘+’ significa que o próximo comando será somado na definição do gráfico

Base wins!

9.3.3 ggplot2 VS base agora com gráficos mais complexos:

O gráfico apresenta a evolução dos preços das casas em dois estados americanos, onde os pontos de cada estado possui uma cor distinta.

plot(Home.Value ~ Date,
     data=subset(housing, State == "MA"))

points(Home.Value ~ Date, col="red",
       data=subset(housing, State == "TX"))

legend(1975, 400000,
       c("MA", "TX"), title="State",
       col=c("black", "red"),
       pch=c(1, 1))

Já com ggplot2:

ggplot(subset(housing, State %in% c("MA", "TX")),
       aes(x=Date,
           y=Home.Value,
           color=State))+
  
  geom_point()

ggplot2 wins!

9.4 Estrutura para montagem de um gráfico

ggplot(data = <default data set>, 
         aes(x = <default x axis variable>,
             y = <default y axis variable>,
             ... <other default aesthetic mappings>),
         ... <other plot defaults>) +

         geom_<geom type>(aes(size = <size variable for this geom>, 
                        ... <other aesthetic mappings>),
                    data = <data for this point geom>,
                    stat = <statistic string or function>,
                    position = <position string or function>,
                    color = <"fixed color specification">,
                    <other arguments, possibly passed to the _stat_ function) +

    scale_<aesthetic>_<type>(name = <"scale label">,
                       breaks = <where to put tick marks>,
                       labels = <labels for tick marks>,
                       ... <other options for the scale>) +

    theme(plot.background = element_rect(fill = "gray"),
          ... <other theme elements>)

9.5 Mapeamento Visual e geometrias (Aesthetic Mapping and geometrics)

9.5.1 Aesthetic Mapping

Em ggplot2 aesthetic significa “algo que pode ser visto”. Exemplo:

- position (i.e., eixos x e y)
- color (cor externa)
- fill (cor interna usada para preencher)
- shape (tipo de símbolo no caso de pontos)
- linetype (tipo de linha)
- size (tamanho)

Cada tipo de objeto geométrico geom aceita somente um subconjunto das aesthetic, que são inseridas via função aes().

9.5.2 Objetos geométricos (geom)

Os objetos geométricos são os símbolos usados em um grafo. Exemplo:

- pontos (`geom_point', para scatter plots, dot plots, etc)
- linhas (`geom_line', para séries temporais, linhas de tendência, etc)
- boxplot (`geom_boxplot', para boxplots!)
- Um gráfico deve ter pelo menos um geomm; Não há limite
- podem ser adicionados como uma camada usando o sinal de `+`

Uma lista das geom_ disponíveis pode ser visualizada usando o comando help.search("geom_", package = "ggplot2") ou simplesmente teclando geom_<tab> em uma boa IDE R (como o Rstudio)

9.6 Pontos (Scatterplot)

`geom_point’ requer que pelo menos o mapeamento de x e y tenham sido feitos. Os outros são opcionais.

hp2001Q1 <- subset(housing, Date == 2001.25) 
ggplot(hp2001Q1,
       aes(y = Structure.Cost, x = Land.Value)) +
       geom_point()

Usando a log() para transformar a variável no eixo x.

ggplot(hp2001Q1,
       aes(y = Structure.Cost, x = log(Land.Value))) +
       geom_point()

9.7 Linhas (Ex. Regressão linear)

Como já foi dito, um gráfico usando ggplot2 pode conter mais de uma geom. Nesse caso, funciona como novas camadas fossem acrescentadas ao gráfico.

Nesse exemplo, vamos incorporar ao gráfico uma linha de predição baseada na regressão linear (veremos adiamte mais detalhadamente esse assunto):

hp2001Q1$pred.SC <- predict(lm(Structure.Cost ~ log(Land.Value), data = hp2001Q1))

p1 <- ggplot(hp2001Q1, aes(x = log(Land.Value), y = Structure.Cost))

p1 + geom_point(aes(color = Home.Value)) +
     geom_line(aes(y = pred.SC))

Obs: No chunk anterior a variável p1 contém a primeira camada do gráfico, e vamos reutilizá-la em outros exemplos abaixo. Aqui usamos duas geom, sendo que a cor dos pontos foi associada também a uma variável do data.frame. Automaticamente uma legenda foi criada e posicionada.

9.8 Smoothers

Esse geom_ inclui uma linha de predição e uma faixa de intervalo de confiança considerando os pontos informados em aes(). Desta vez vamos reaproveitar nossa variável p1.

p1 +
  geom_point(aes(color = Home.Value)) +
  geom_smooth()
## `geom_smooth()` using method = 'loess'

9.9 Texto (Label Points)

p1 + 
  geom_text(aes(label=State), size = 3)

obs: Para mais possibilidades com textos existe o pacote ggrepel (Slowikowski 2017).

## install.packages("ggrepel") 
  library("ggrepel")
  p1 + 
  geom_point() + 
  geom_text_repel(aes(label=State), size = 3)

9.10 Aesthetic Mapping VS Assignment

É importante frisar que as variáveis são mapeadas visualmente dentro da função aes(), enquanto que mapementos visual fixo (fixed aesthetics) como o tamanho de pontos deve ser realizado fora de aes().

Por exemplo:

p1 +
  geom_point(aes(size = 2),  # Errado! 2 não é uma variável
             color="red")    # ok -- todos os pontos devem ser *red*

Mais de uma variável mapeada em aes():

p1 +
  geom_point(aes(color=Home.Value, shape = region))
## Warning: Removed 1 rows containing missing values (geom_point).

9.11 Exercicio I

Os dados para este exercício estão em no arquivo ‘EconomistData.csv’.

A fonte original dos dados é:

Esses dados revelam o Índice de Desenvolvimento Humano(HDI) e o Índice Corrupção Perceptível(CPI) de diversos países.

dat <- read.csv("https://efsilvaa.github.io/IntroR/dados/EconomistData.csv")
head(dat)
##   X     Country HDI.Rank   HDI CPI            Region
## 1 1 Afghanistan      172 0.398 1.5      Asia Pacific
## 2 2     Albania       70 0.739 3.1 East EU Cemt Asia
## 3 3     Algeria       96 0.698 2.9              MENA
## 4 4      Angola      148 0.486 2.0               SSA
## 5 5   Argentina       45 0.797 3.0          Americas
## 6 6     Armenia       86 0.716 2.6 East EU Cemt Asia
1. Crie um gráfico de pontos (scatter plot) com CPI no eixo x e HDI no eixo y.
2. Colorir os pontos em azul (blue).
3. Use a região para mapear a cor dos pontos.
4. Aumente o tamanho dos pontos (size = 2)
5. Associe o tamanho dos pontos ao HDI.Rank


9.12 Recursos adicionais

ggplot2:

  - Mailing list: [http://groups.google.com/group/ggplot2](http://groups.google.com/group/ggplot2)
  - Wiki: [https://github.com/hadley/ggplot2/wiki](https://github.com/hadley/ggplot2/wiki)
  - Website: [http://had.co.nz/ggplot2/](http://had.co.nz/ggplot2/)
  - StackOverflow: [http://stackoverflow.com/questions/tagged/ggplot](http://stackoverflow.com/questions/tagged/ggplot)

References

Wickham, Hadley, and Winston Chang. 2016. Ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://CRAN.R-project.org/package=ggplot2.

Wilkinson, Leland. 2005. The Grammar of Graphics. 2nd ed. Springer-Verlag New York.

Slowikowski, Kamil. 2017. Ggrepel: Repulsive Text and Label Geoms for ’Ggplot2’. https://CRAN.R-project.org/package=ggrepel.