Primeira parte

Introdução

O pacote ggplot2 está disponível para instalação no repositório CRAN do R para as versões \(3.1.1\) ou superiores, sendo fruto da tese de doutorado do pesquisador Hadley Wickham. Este pacote é voltado para a criação de gráficos estatísticos. Mas como construir um gráfico estatístico? Segundo Hadley, um gráfico estatístico é construído baseado na gramática em camadas de gráficos e tem origem a partir de atributos estéticos (posição, cor, forma, tamanho) de objetos geométricos (pontos, linhas, barras, caixas, etc…).

Hadley Wickham sugere em seu livro ggplot2: Elegant Graphics for Data Analysis que dados, sistemas de coordenadas, rótulos e anotações possam ser divididos em layers (camadas). Essas camadas são construídas uma a uma na elaboração de gráficos estatísticos. Essa é a essência deste pacote.

O pacote ggplot2 apresenta algumas vantagens em relação a outros pacotes mais conhecidos disponíveis no R. Primeiro, os gráficos produzidos pelo ggplot2 são mais bonitos. Segundo, o mesmo permite maior controle do usuário. Terceiro, as funções utilizadas neste pacote seguem um certo padrão e são fáceis de utilizar. Quarto, é possível construir vários gráficos com poucas linhas de comando. Mas o que é a gramática em camadas de gráficos?

A gramática em camadas de gráficos

Basicamente podemos descrever individualmente qualquer gráfico como uma combinação de um conjunto de dados, um geom, um conjunto de mapeamentos, um stat, um ajuste de posição, um sistema de coordenadas e um esquema de facetas. Para melhor entendimento, pense que vamos construir um gráfico começando do zero. Então, o primeiro passo é obter um conjunto de dados. Depois precisamos transformá-lo na informação em que queremos exibir (stat). Em seguida, podemos escolher um objeto geométrico para representar cada observação nos dados transformados. O próximo passo é utilizar as propriedades estéticas dos geoms para representar variáveis nos dados. Nós mapeamos os valores de cada variável aos níveis de uma estética. O próximo passo é selecionar um sistema de coordenadas no qual os geoms seriam colocados. Nosso gráfico então estaria completo. Mas nós podemos ainda dividir esse gráfico em facetas (subgráficos). Também poderíamos adicionar outras camadas adicionais, sendo que cada uma delas usaria um novo conjunto de dados, um novo geom, um novo conjunto de mapeamentos, um novo stat e um novo ajuste de posição.

Como construir gráficos utilizando o pacote ggplot2?

Abaixo apresentamos os sete elementos que envolvem a construção de gráficos no ggplot2. Os elementos marcados com * são essenciais e obrigatórios. Os termos em negrito, como em aes, representam as funções a serem utilizadas no ggplot2 para a construção dos gráficos.

Elementos Exemplos
aestética\(^*\) cor, formato
geometrias\(^*\) barra, ponto
estatísticas (modelos) mediana, máximo
facetas facetas
coordenadas polar, cartesiana
themas eixos, títulos

Vamos agora realizar essa construção passo a passo no R. Os dados devem ser um data.frame. Essa condição é obrigatória para o uso do ggplot2. Primeiramente vamos instalar e carregar o pacote tidyverse. Depois, vamos colocar o conjunto de dados mtcars, disponível no R, em data.frame. Feito isso, nós estamos em condições de iniciar a construção de gráficos no ggplot2.

library(tidyverse)
## -- Attaching packages ----------------------------------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2     v purrr   0.3.4
## v tibble  3.0.3     v dplyr   1.0.1
## v tidyr   1.1.1     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## -- Conflicts -------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
mtcars <- as.data.frame(mtcars)

A primeira camada (layer) necessária para a criação de gráficos no ggplot2 é dada pelo comando ggplot(dados). Neste comando, estamos criando a área onde o gráfico será construído e, ainda, informando ao ggplot2 qual o conjunto de dados que contém essas variáveis.

ggplot(mtcars)

Note que aparece uma área (em cinza) onde será construído o gráfico. Essa área ainda não contém nenhum formato geométrico como, por exemplo, pontos, barras, caixas, etc. Esse é o próximo passo.

Precisamos informar ao ggplot2 qual o formato geométrico (geom_tipo) que queremos construir o nosso gráfico. Além disso, precisamos informar também ao ggplot2 qual a estética (aes(x,y,cores, …)) que queremos dar ao nosso gráfico: variável do eixo x, variável do eixo y, cores, etc. Para isso, nós utilizamos o comando geom_tipo(aes(x,y,cores,...)). Note também que a cada acréscimo de camada utilizamos o sinal +.

ggplot(mtcars) +
  geom_point(mapping = aes(x= disp, y=mpg))

A variável disp significa cilindradas e a variável mpg significa milhas por galão. Note que ainda não escolhemos a cor dos pontos do gráfico nem rotulamos seus eixos. Nosso gráfico ainda está incompleto.

Para escolhermos a cor da forma geométrica dos gráficos gerados pelo ggplot2, temos três comandos: color, colour e fill. O comando color é utilizado nos gráficos de dispersão (pontos) pois, por definição, pontos não possuem área. O comando colour é utilizado quando desejamos colorir a borda de um ente geométrico que represente uma área: caixas, barras, etc. O comando fill é utilizado para colorir o interior desses entes geométricos (preenchimento). Além disso, esses comandos podem ser utilizados dentro do comando aes ou fora dele, diferenciando apenas no argumento a ser utilizado. Os exemplos a seguir ilustram bem sua utilização. Note que utilizamos o comando color pois trata-se de um gráfico de dispersão. Além disso, a variável am, que significa tipo de transmissão e é rotulada como: 0 representando transmissão automática e 1 representando transmissão manual, foi escolhida para ser utilizada no comando color. Então, os pontos do nosso gráfico foram coloridos de acordo com os níveis dessa terceira variável. Além disso, foi criado uma legenda automática.

ggplot(mtcars) +
  geom_point(mapping = aes(x= disp, y=mpg, color=as.factor(am), shape = as.factor(am)), size = 5) +
  labs(x="Cilindradas", y="Milhas/galão")

Entretanto, podemos acrescentar nesses gráficos animações. Você pode encontrar os códigos dos emoji disponíveis aqui emoji

ggplot(mtcars) +
  geom_point(mapping = aes(x= disp, y=mpg, color=as.factor(am)), shape = "\U0001F694", size = 5) +
  labs(x="Cilindradas", y="Milhas/galão")

No próximo exemplo, construímos o mesmo gráfico, porém agora com o comando color fora do comando aes. Note que agora temos a liberdade de escolha da cor que quisermos para os pontos do gráfico. Porém, uma legenda automática não é criada. Mais adiante veremos como construir uma legenda.

 ggplot(mtcars) +
  geom_point(mapping = aes(x= disp, y=mpg), color=c("red"))+
  labs(x="Cilindradas", y="Milhas/galão")

Então podemos concluir que todos os comandos que estão dentro da função aes são relacionados a variáveis. Vamos agora apresentar um exemplo da construção de um boxplot, onde vamos utilizar os comandos colour e fill. A variável utilizada será a mpg, que é contínua e vamos apresentar o consumo separado por número de cilindros que um motor possui (cyl).

 ggplot(mtcars) +
  geom_boxplot(aes(x = as.factor(cyl), y = mpg, colour=as.factor(cyl))) +
  labs(x = "Número de cilindros", y = "Milhas/galão")

Note que agora utilizamos o comando colour com a variável cyl. Como dissemos anteriormente, apenas a borda das caixas do boxplot foi colorida. A mesma foi colorida de acordo com os níveis da variável cyl.

No próximo passo vamos utilizar o comando fill. Vejamos a diferença.

 ggplot(mtcars) +
  geom_boxplot(aes(x = as.factor(cyl), y = mpg, fill=as.factor(cyl))) +
  labs(x = "Número de cilindros", y = "Milhas/galão")

Os comandos colour e fill podem ser utilizados conjuntamente. Vejamos.

 ggplot(mtcars) +
  geom_boxplot(aes(x = as.factor(cyl), y = mpg, fill=as.factor(cyl), 
                   colour=as.factor(cyl))) +
  labs(x = "Número de cilindros", y = "Milhas/galão")

Note que, neste último caso, o boxplot está fora dos padrões. Não conseguimos identificar quem é a mediana, nem os quartis. Isso ocorre que por não temos a liberdade de escolha de cores quando os comandos color, colour e fill são utilizados dentro da função aes.

Neste momento, vamos utilizar apenas o comando colour fora da função aes. Vejamos a diferença.

 ggplot(mtcars) +
  geom_boxplot(aes(x = as.factor(cyl), y = mpg, fill=as.factor(cyl)), colour="black") +
  labs(x = "Número de cilindros", y = "Milhas/galão")

Podemos ainda escolher a tonalidade das cores que escolhemos. Para tal, basta darmos o comando alpha. Os valores de alpha estão entre 0 e 1. Valores mais próximos de 0 indicam tonalidade mais fraca. Vejamos.

 ggplot(mtcars) +
  geom_boxplot(aes(x = as.factor(cyl), y = mpg), fill=c("red", "green", "blue"),
               colour="brown", alpha=0.2) +
  geom_jitter(aes(x = as.factor(cyl), y = mpg, colour = as.factor(am)), alpha = 0.45)+
  labs(x = "Número de cilindros", y = "Milhas/galão")

Como dissemos anteriormente, o ggplot2 permite ao usuário a liberdade de escolha para formatar seus gráficos e deixá-los apresentáveis. Observe que estes gráficos ainda não apresentam uma boa qualidade. Caso desejarmos retirar as linhas de grade que estão no plano de fundo da área do gráfico, acrescentarmos legenda manualmente, escolhermos a fonte, o tamanho de letra dos rótulos, destacarmos os eixos, entre outras coisas, é possível com o ggplot2. Os comandos a seguir fazem este trabalho. Construímos o mesmo gráfico um grande número de vezes, cada um com sua particularidade.

ggplot(mtcars) +
  geom_boxplot(aes(x = as.factor(cyl), y = mpg, fill=as.factor(am)), colour="brown", 
               alpha=0.2) +
  labs(x = "Número de cilindros", y = "Milhas/galão") +
  theme_bw()+
  theme(legend.position="top", 
        legend.box = "horizontal",legend.title=element_text(size=15), 
        legend.text=element_text(size=15), axis.text=element_text(size=20),
        axis.title=element_text(size=20), axis.line = element_line(colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) +
  scale_fill_manual(values=c("red", "blue"), 
                       name="Transmissão",
                       breaks=c("0", "1"),
                       labels=c("automática", "manual"))

 cores <- gray(0:2 / 2)
 ggplot(mtcars) +
  geom_boxplot(aes(x = as.factor(cyl), y = mpg, fill=as.factor(am)), colour="black", 
               alpha=0.2) +
  labs(x = "Número de cilindros", y = "Milhas/galão") +
  theme_bw() +
  theme(legend.position="right", 
        legend.box = "horizontal",legend.title=element_text(size=15), 
        legend.text=element_text(size=15), axis.text=element_text(size=20),
        axis.title=element_text(size=20), axis.line = element_line(colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) +
  scale_fill_manual(values=cores, 
                       name="Transmissão",
                       breaks=c("0", "1"),
                       labels=c("automática", "manual"))

Vamos agora construir dois histogramas com frequências relativas. Note que o comando bins define o número de classes a ser escolhido. Neste exemplo escolhemos arbitrariamente bins igual a 5, mas o usuário pode fazer os cálculos manualmente e utilizá-lo. Nós também definimos a escala dos eixos x e y manualmente, através dos comandos scale_x_continuous e scale_y_continuous.

 ggplot(mtcars) +
  geom_histogram(aes(x = mpg, y = (..count..)), fill = "red",
                 bins=5, colour="brown", alpha=0.2, position = "dodge")+
  labs(x = "Milhas/galão", y = "Frequência absoluta") +
  theme_bw() +
  theme(legend.position="bottom", 
        legend.box = "horizontal",legend.title=element_text(size=15), 
        legend.text=element_text(size=15), axis.text=element_text(size=20),
        axis.title=element_text(size=20), axis.line = element_line(colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank())

Como já vimos, o tipo de transmissão do veículo interfere no consumo do automóvel. Vamos agora construir um gráfico que apresente a função densidade de consumo (mpg) por tipo de transmissão (am).

 cor <- heat.colors(2, rev = FALSE, alpha = 0.65)
 ggplot(mtcars) +
      geom_density(aes(x = mpg, fill = as.factor(am)), alpha = 0.1) +
  labs(x = "Milhas/galão", y = "Densidade") +
  theme_bw() +
  theme(legend.position="top", 
        legend.box = "horizontal",legend.title=element_text(size=20), 
        legend.text=element_text(size=20), axis.text=element_text(size=12),
        axis.title=element_text(size=20), axis.line = element_line(colour = "black"),
        strip.text.x = element_text(size=0),
        strip.background = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) +
  scale_fill_manual(values=cor, 
                    name="Transmissão",
                    breaks=c("0", "1"),
                    labels=c("automática", "manual"))

Nosso interesse agora é enxergar essas densidades em gráficos separados: um para cada tipo de transmissão. Para isso, vamos apresentar o comando facet, que nos ajuda a construir gráficos em facetas ou subgráficos. Vejamos.

 cor <- heat.colors(2, rev = FALSE, alpha = 0.65)
 ggplot(mtcars) +
      geom_density(aes(x = mpg, fill = as.factor(am)), alpha = 0.1) +
  labs(x = "Milhas/galão", y = "Densidade") +
   facet_wrap(~ as.factor(am)) +
  theme_bw() +
  theme(legend.position="top", 
        legend.box = "horizontal",legend.title=element_text(size=20), 
        legend.text=element_text(size=20), axis.text=element_text(size=12),
        axis.title=element_text(size=20), axis.line = element_line(colour = "black"),
        strip.text.x = element_text(size=0),
        strip.background = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) +
  scale_fill_manual(values=cor, 
                    name="Transmissão",
                    breaks=c("0", "1"),
                    labels=c("automática", "manual"))

Vamos agora apresentar um gráfico de barras ilustrando o total de cilindros que o motor possui cyl por tipo de transmissão am. Note que aqui utilizamos o comando geom_bar que pode dispensar o argumento do eixo y.

ggplot(mtcars, aes(x = as.factor(cyl))) +
  geom_bar(aes(fill=as.factor(am)), 
            position = "dodge", colour="black", alpha=0.2)+
  labs(x = "Número de cilindros por motor", y = "Frequência") +
  theme_bw() +
  theme(legend.position="bottom", 
        legend.box = "horizontal",legend.title=element_text(size=15), 
        legend.text=element_text(size=15), axis.text=element_text(size=20),
        axis.title=element_text(size=20), axis.line = element_line(colour = "black"),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) +
  scale_fill_manual(values=c("red", "blue"), 
                    name="Transmissão",
                    breaks=c("0", "1"),
                    labels=c("automática", "manual"))

Utilizando a função facet, apresentamos o gráfico de barras para cyl separado por cada tipo de transmissão.

ggplot(mtcars, aes(x = as.factor(cyl))) +
  geom_bar(aes(fill=as.factor(am)), 
            position = "dodge", colour="black", alpha=0.2)+
  facet_wrap(~as.factor(am), ncol = 2)+
  labs(x = "Número de cilindros por motor", y = "Frequência") +
  theme_bw() +
  theme(legend.position="bottom", 
        legend.box = "horizontal",legend.title=element_text(size=15), 
        legend.text=element_text(size=15), axis.text=element_text(size=20),
        axis.title=element_text(size=20), axis.line = element_line(colour = "black"),
        strip.text.x = element_text(size=0),
        strip.background = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_blank()) +
  scale_fill_manual(values=c("red", "blue"), 
                    name="Transmissão",
                    breaks=c("0", "1"),
                    labels=c("automática", "manual"))

Nossos gráficos já estão com uma boa qualidade para serem apresentados em alguma página web ou até mesmo em alguma revista científica.

Segunda parte

Construindo gráficos a partir de um conjunto de dados original usando os pacotes tydeverse, tibble e dplyr do R.

O que preciso saber do pacote dplyr:

Funções Resultados
filter() seleciona observações das variáveis por seus valores assumidos
arrange() reordena as linhas (observações)
select() seleciona variáveis por seus nomes (rótulos)
mutate() cria novas variáveis com funções de variáveis existentes
summarize() reúne muitos valores em um único resumo
group_by() muda o escopo de cada função anterior em todo o conjunto de dados para operar grupo por grupo.

Uma vez apresentado as funções do pacote dplyr, vamos agora apresentar os argumento dessas funções. O primeiro argumento é um data frame. Os argumentos subsequentes descrevem o que fazer com o data frame usando os nomes das variáveis sem aspas. Para exemplificar, vamos considerar o conjunto de dados disponível no pacote covid19br, que trata dos dados da COVID-\(19\) no Brasil e também no mundo, considerando o número diário de casos e também de mortes novos e acumulados. No caso do Brasil, o mesmo apresenta essa contagem por semana, para cada unidade da federação e também para cada município, considerando as variáveis região, bem como a população residente em cada unidade federativa na data recorrente. Esse conjunto de dados é atualizado automaticamente todos os dias. Vamos tratar apenas da situação da COVID-\(19\) no Brasil.

library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(dplyr)
library(covid19br)
covid_brasil <- downloadCovid19("state")
head(covid_brasil)
## # A tibble: 6 x 12
##   region state date       epi_week newCases accumCases newDeaths accumDeaths
##   <chr>  <chr> <date>        <int>    <int>      <int>     <int>       <int>
## 1 North  RO    2020-02-25        9        0          0         0           0
## 2 North  RO    2020-02-26        9        0          0         0           0
## 3 North  RO    2020-02-27        9        0          0         0           0
## 4 North  RO    2020-02-28        9        0          0         0           0
## 5 North  RO    2020-02-29        9        0          0         0           0
## 6 North  RO    2020-03-01       10        0          0         0           0
## # ... with 4 more variables: newRecovered <int>, newFollowup <int>, pop <dbl>,
## #   state_code <int>

Não se preocupe com a estrutura apresentada nesse conjunto de dados. Trata-se de um tibble, um data frame com algumas particularidades. Note que as estruturas de data frame trazem algumas informações, como a dimensão dos dados, o tipo de variável que está em cada uma das colunas (categórica, inteiro, caractere, etc.), entre outras.

Representação Tipo de variável
int números inteiros
dbl doubles (números reais)
chr vetores de caracteres (strings)
dttm datas-tempos (uma data + um horário)
fctr valores lógicos (TRUE ou FALSE)
date datas

Antes de apresentarmos as funções precisamos conhecer alguns caracteres lógicos e suas representações.

Caractere lógico Representação
== igual
& conectivo e (interseção)
| conectivo ou (união)
> maior do que
< menor do que
>= maior do que ou igual a
<= menor do que ou igual a
!= diferente
%in% concatenar

As funções do pacote dplyr.

filter(covid_brasil, date == "2021-01-02" & epi_week == 53)
## # A tibble: 27 x 12
##    region state date       epi_week newCases accumCases newDeaths accumDeaths
##    <chr>  <chr> <date>        <int>    <int>      <int>     <int>       <int>
##  1 North  RO    2021-01-02       53      434      96433         3        1825
##  2 North  AC    2021-01-02       53      252      41941         2         798
##  3 North  AM    2021-01-02       53      293     201867        30        5325
##  4 North  RR    2021-01-02       53      148      68858         0         787
##  5 North  PA    2021-01-02       53        5     293807        10        7209
##  6 North  AP    2021-01-02       53       80      68441         1         927
##  7 North  TO    2021-01-02       53       56      90592         3        1239
##  8 North~ MA    2021-01-02       53       17     200976         7        4513
##  9 North~ PI    2021-01-02       53       31     143210         8        2848
## 10 North~ CE    2021-01-02       53      582     336574        22       10015
## # ... with 17 more rows, and 4 more variables: newRecovered <int>,
## #   newFollowup <int>, pop <dbl>, state_code <int>
arrange(covid_brasil, epi_week)
## # A tibble: 8,937 x 12
##    region state date       epi_week newCases accumCases newDeaths accumDeaths
##    <chr>  <chr> <date>        <int>    <int>      <int>     <int>       <int>
##  1 North  RO    2021-01-03        1      473      96906         7        1832
##  2 North  RO    2021-01-04        1      291      97197         8        1840
##  3 North  RO    2021-01-05        1      657      97854        12        1852
##  4 North  RO    2021-01-06        1      957      98811        23        1875
##  5 North  RO    2021-01-07        1      784      99595        15        1890
##  6 North  RO    2021-01-08        1      748     100343         9        1899
##  7 North  RO    2021-01-09        1      681     101024         9        1908
##  8 North  AC    2021-01-03        1      105      42046         4         802
##  9 North  AC    2021-01-04        1       71      42117         4         806
## 10 North  AC    2021-01-05        1       53      42170         2         808
## # ... with 8,927 more rows, and 4 more variables: newRecovered <int>,
## #   newFollowup <int>, pop <dbl>, state_code <int>
select(covid_brasil, epi_week , newCases, accumCases)
## # A tibble: 8,937 x 3
##    epi_week newCases accumCases
##       <int>    <int>      <int>
##  1        9        0          0
##  2        9        0          0
##  3        9        0          0
##  4        9        0          0
##  5        9        0          0
##  6       10        0          0
##  7       10        0          0
##  8       10        0          0
##  9       10        0          0
## 10       10        0          0
## # ... with 8,927 more rows
mutate(covid_brasil, incidence =  newCases/pop*100)
## # A tibble: 8,937 x 13
##    region state date       epi_week newCases accumCases newDeaths accumDeaths
##    <chr>  <chr> <date>        <int>    <int>      <int>     <int>       <int>
##  1 North  RO    2020-02-25        9        0          0         0           0
##  2 North  RO    2020-02-26        9        0          0         0           0
##  3 North  RO    2020-02-27        9        0          0         0           0
##  4 North  RO    2020-02-28        9        0          0         0           0
##  5 North  RO    2020-02-29        9        0          0         0           0
##  6 North  RO    2020-03-01       10        0          0         0           0
##  7 North  RO    2020-03-02       10        0          0         0           0
##  8 North  RO    2020-03-03       10        0          0         0           0
##  9 North  RO    2020-03-04       10        0          0         0           0
## 10 North  RO    2020-03-05       10        0          0         0           0
## # ... with 8,927 more rows, and 5 more variables: newRecovered <int>,
## #   newFollowup <int>, pop <dbl>, state_code <int>, incidence <dbl>
summarize(covid_brasil, mean_newcases=mean(newCases), desvpad_newcases= sd(newCases),standarderror_newcases=desvpad_newcases/sqrt(n()))
## # A tibble: 1 x 3
##   mean_newcases desvpad_newcases standarderror_newcases
##           <dbl>            <dbl>                  <dbl>
## 1          952.            1671.                   17.7
group_by(covid_brasil, state, epi_week)
## # A tibble: 8,937 x 12
## # Groups:   state, epi_week [1,296]
##    region state date       epi_week newCases accumCases newDeaths accumDeaths
##    <chr>  <chr> <date>        <int>    <int>      <int>     <int>       <int>
##  1 North  RO    2020-02-25        9        0          0         0           0
##  2 North  RO    2020-02-26        9        0          0         0           0
##  3 North  RO    2020-02-27        9        0          0         0           0
##  4 North  RO    2020-02-28        9        0          0         0           0
##  5 North  RO    2020-02-29        9        0          0         0           0
##  6 North  RO    2020-03-01       10        0          0         0           0
##  7 North  RO    2020-03-02       10        0          0         0           0
##  8 North  RO    2020-03-03       10        0          0         0           0
##  9 North  RO    2020-03-04       10        0          0         0           0
## 10 North  RO    2020-03-05       10        0          0         0           0
## # ... with 8,927 more rows, and 4 more variables: newRecovered <int>,
## #   newFollowup <int>, pop <dbl>, state_code <int>

Esse pacote dplyr é muito útil quando desejamos realizar uma análise exploratória de nossos dados. Vamos então construir alguns gráficos utilizando os recursos desse pacote e também do ggplot2.

Suponha que estamos interessados em conhecer, “a priori”, quantas mortes por COVID-\(19\) ocorreram em cada uma das unidades federativas brasileiras, na trigésima semana de infecção. Como proceder?

Entretanto, muitas vezes pode ser interessante especificar uma variável no eixo y e, nesse caso, se optarmos por utilizar o comando geom_bar devemos utilizar o argumento stat = "identity".

Dados <- select(covid_brasil, epi_week , state,  newDeaths, date)
resultados <- filter(Dados, date == "2020-05-19", epi_week == 21)
ggplotly(ggplot(resultados)+
  geom_bar(aes(x=state, y=newDeaths), fill = heat.colors(28), 
           alpha=0.65, position = "stack", stat = "identity")+
    scale_y_continuous(breaks = c(seq(0,300,50)))+
  labs(x = "Unidades da federação", y = "Novas mortes - semana 21")+
  theme_bw()+
  theme(legend.position="right", 
        legend.box = "vertical",legend.title=element_text(size=8), 
        legend.text=element_text(size=8), axis.text=element_text(size=8),
        axis.title=element_text(size=8), axis.line = element_line(colour = "black"),
        strip.text.x = element_text(size=0),
        strip.background = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.border = element_blank(),
        panel.background = element_rect(fill = "#2F4F4F")))

Um fato curioso deve ser notado: quando manipulamos o conjunto de dados data com as funções select e filter, nós atribuímos a cada tibble gerado por essas funções um rótulo. Agora, imagine que, dentro do mesmo conjunto de dados, nós precisamos utilizar todas as seis funções do pacote dplyr. Seria inviável proceder como da forma anterior. Para corrigir esse problema, foi criado o pacote magrittr onde foi criado o operador pipe %>%. Essa ferramenta é utilizada para expressar claramente uma sequência de múltiplas operações. Este pacote já é carregado automaticamente como dplyr.

Em nosso próximo exemplo, suponha que se deseja conhecer a evolução diária das novas mortes considerando o tempo de infecção por COVID-\(19\) no dia 15-01-2021, para as unidades federativas da região sudeste. Note que optamos por utilizar o comando geom_col e, nesse caso, mesmo sendo especificado a variável y não necessitamos utilizar o argumento stat = "identity".

library(RColorBrewer)
resultados <- covid_brasil %>%
  select(newDeaths, state, date)%>%
  filter(date == "2021-01-15", state %in% c("SP", "RJ", "MG", "ES"))
ggplotly(ggplot(resultados, aes(x=state, y = newDeaths))+
           geom_col(aes(fill=state), position = "dodge", alpha=0.65) +
           scale_fill_brewer(palette = "BrBG", direction = 1) +
           labs(x = "Unidades federativas", y = "Novas mortes Covid- 19 - 15/01/2021") +
           theme_bw()+
           theme(legend.position="none", 
                 legend.box = "vertical",legend.title=element_text(size=8), 
                 legend.text=element_text(size=8), axis.text=element_text(size=8),
                 axis.title=element_text(size=8), axis.line = element_line(colour = "black"),
                 strip.text.x = element_text(size=0),
                 strip.background = element_blank(),
                 panel.grid.major = element_blank(),
                 panel.grid.minor = element_blank(),
                 panel.border = element_blank(),
                 panel.background = element_rect(fill = "#FFFAF0")))

Podemos também utilizar o pacote gganimate para gerar animações em gráficos gerados no ggplot2. Vejamos.

library(viridis)
library(gganimate)
ggplot(covid_brasil) +
  geom_bar(aes(x=as.factor(state), y=newCases, fill=as.factor(state)), stat="identity", alpha=0.5) +
  transition_states(
    epi_week,
    transition_length = 2,
    state_length = 10
  ) +
  scale_fill_viridis(discrete=TRUE) 

Em nosso próximo exemplo, iremos tratar da produção de banana e de laranja, no estado de São Paulo, durante um período de 16 semanas.

load("hortifruti.RData")
head(hortifruti)
## # A tibble: 6 x 5
##   semana semana_mês banana laranja  maçã
##    <dbl>      <dbl>  <dbl>   <dbl> <dbl>
## 1      1          1   1000    1700  2400
## 2      2          2   1100    1200  1200
## 3      3          3   1500    1000   500
## 4      4          4    700     600   700
## 5      5          1   2000    3500  4700
## 6      6          2   2200    2300  2700
ggplot(hortifruti) +
  geom_point(aes(as.factor(semana), banana), 
             color = "#FFD700", 
             shape = "\U0001F34C", 
             size = 5) +
  geom_point(aes(as.factor(semana), laranja), 
             color = "#9ACD32", 
             shape = "\U0001F34B", 
             size = 5) +
  labs(title = "Produção de banana e laranja",
       subtitle = "Acompanhamento pelo período de 16 semanas",
       x = "Semana",
       y = "Produção") +
  theme_classic()

Como motivação para a continuidade desse curso, pode ser de interesse e algum pesquisador apresentar um mapa, por exemplo, da Amazônia Legal, contendo informações sobre área desmatada, área de concentração indígena e hidrografia. Nós iremos ver como construir esse e também outros mapas, tal como a Figura 1 abaixo.

Figure 1: Caracterização da Amazônia Legal.


  1. Diest/Ipea RJ, ↩︎