O post de hoje é sobre visualização de dados com dimensão espacial e temporal. Basicamente são gráficos que têm uma representação geográfica associada a informações que variam no tempo. Este tipo de análise é comum no meu dia a dia e por isso resolvi deixar 3 alternativas registradas aqui. O contexto que iremos abordar está relacionado ao banco de dados de focos de incêndios registrados pelo INPE no Programa Queimadas Monitoramento por Satélites. O site é bem interessante e apresenta algumas estatísticas úteis sobre as queimadas na América do Sul e Brasil. Iremos trabalhar com a tabela que resume os focos de incêndios por ano e Estado brasileiro.

if (!require("pacman")) install.packages("pacman")
pacman::p_load(readr, dplyr, sf, ggplot2, ggthemes, geofacet, scales)
pacman::p_load_gh("italocegatta/brmap")
pacman::p_load_gh("thomasp85/gganimate")

O primeiro passo foi copiar os dados da página e organizá-los no formato tidy. Poderíamos fazer uma análise exploratória dos dados, mas quero manter o foco em algo bem pontual: como mostrar os dados brutos de uma só vez? Ou seja, considerando a dimensão de tempo (ano), geografia (localização do estado) e variável resposta (focos) na mesma janela gráfica, de que forma poderíamos apresentar os dados?

focos <- read_csv2("https://raw.githubusercontent.com/italocegatta/italocegatta.github.io_source/master/content/dados/base_incendios.csv")

focos
## # A tibble: 162 x 3
##    sigla   ano focos
##    <chr> <dbl> <dbl>
##  1 AC     2011    13
##  2 AL     2011   127
##  3 AM     2011   159
##  4 AP     2011     5
##  5 BA     2011   883
##  6 CE     2011    44
##  7 DF     2011     8
##  8 ES     2011    55
##  9 GO     2011   492
## 10 MA     2011   656
## # ... with 152 more rows

Vamos agora adicionar a referência espacial aos dados utilizando os polígonos do pacote brmap.

estados_focos <-  focos %>% 
  left_join(brmap_estado_simples, by = c("sigla" = "estado_sigla")) %>% 
  st_as_sf()

estados_focos
## Simple feature collection with 162 features and 6 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -73.99045 ymin: -33.75077 xmax: -34.79288 ymax: 5.271841
## epsg (SRID):    4674
## proj4string:    +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
## # A tibble: 162 x 7
##    sigla   ano focos estado_cod regiao_cod estado_nome
##    <chr> <dbl> <dbl>      <int>      <int> <chr>      
##  1 AC     2011    13         12          1 Acre       
##  2 AL     2011   127         27          2 Alagoas    
##  3 AM     2011   159         13          1 Amazonas   
##  4 AP     2011     5         16          1 Amapá      
##  5 BA     2011   883         29          2 Bahia      
##  6 CE     2011    44         23          2 Ceará      
##  7 DF     2011     8         53          5 Distrito F~
##  8 ES     2011    55         32          3 Espírito S~
##  9 GO     2011   492         52          5 Goiás      
## 10 MA     2011   656         21          2 Maranhão   
## # ... with 152 more rows, and 1 more variable: geometry <POLYGON [°]>

A primeira abordagem vai utilizar o pacote geofacet. Ele permite criarmos um grid de referência para orientar a função facet_wrap de ggplot2. O pacote já vem carregado com um grid do Brasil, o br_grid1, mas você pode construir e utilizar seu próprio grid. Eu, particularmente, gosto desta representação pois é extremamente flexível e comporta uma infinidade de gráficos (linhas, pontos, barras…) e dimensões (color, shape, size…). O gráfico 1 está bem simples mas cumpre seu papel em facilitar a percepção da variação anual e dar uma noção da região espacial do Estado no Brasil.

ggplot(estados_focos, aes(ano, focos)) +
  geom_line() +
  facet_geo(~estado_nome, grid = br_states_grid1) +
  labs(
    x = "Ano",
    y = "Nº de focos de incêndios"
  ) +
  scale_x_continuous(breaks = 2011:2017, labels = 11:17) +
  scale_y_continuous(label = unit_format(unit = "k", scale = 1e-3)) +
  theme_bw()
Representação em painel orientado utilizando linhas.

Figura 1: Representação em painel orientado utilizando linhas.

A segunda abordagem é relativamente simples e intuitiva. Construiremos um mapa temático utilizando o Nº de focos como escala de cor, mas organizado em um painel que tem como base o ano de registro. O gráfico 2 apela para a dimensão de cor e instantaneamente nos informa o estado mais crítico. Especificamente para esta análise ele este tipo de gráfico é muito apropriado.

ggplot(estados_focos) +
  geom_sf(aes(fill = focos), color = NA) +
  facet_wrap(~ano) +
  labs(fill = "Nº de focos de incêndios") +
  scale_fill_viridis_c(label = unit_format(unit = "k", scale = 1e-3)) +
  coord_sf(datum = NA) +
  theme_bw(16) +
  theme(legend.position = "bottom", legend.justification = "right") +
  guides(fill = guide_colorbar(barwidth = 15, title.position = "top"))
Representação em painel utilizando cores.

Figura 2: Representação em painel utilizando cores.

E por fim, nossa terceira tentativa vai unificar os painéis do gráfico 2 em um gif animado. A limitação do gráfico é que muitas vezes nossos gráficos vão para documentos estáticos como PDF e Word, inviabilizando o gif.

ggplot(estados_focos) +
  geom_sf(aes(fill = focos), color = NA) +
  labs(
    title = "Ano: {current_frame}",
    fill = "Nº de focos de incêndios"
  ) +
  scale_fill_viridis_c(label = unit_format(unit = "k", scale = 1e-3)) +
  theme_bw(18) +
  theme(legend.position = "bottom", legend.justification = "right") +
  guides(fill = guide_colorbar(barwidth = 15, title.position = "top")) +
  transition_manual(ano)

Caso tenha alguma dúvida ou sugestão sobre o post, fique à vontade para fazer um comentário ou me contatar por E-mail.

sessioninfo::session_info(c("readr", "dplyr", "ggplot2", "sf", "geofacet", "gganimate", "scales", "brmap"))
## - Session info ----------------------------------------------------------
##  setting  value                       
##  version  R version 3.5.3 (2019-03-11)
##  os       Windows 10 x64              
##  system   x86_64, mingw32             
##  ui       RTerm                       
##  language (EN)                        
##  collate  Portuguese_Brazil.1252      
##  ctype    Portuguese_Brazil.1252      
##  tz       America/Sao_Paulo           
##  date     2019-08-25                  
## 
## - Packages --------------------------------------------------------------
##  package       * version     date       lib source        
##  askpass         1.1         2019-01-13 [1] CRAN (R 3.5.2)
##  assertthat      0.2.1       2019-03-21 [1] CRAN (R 3.5.3)
##  backports       1.1.4       2019-04-10 [1] CRAN (R 3.5.3)
##  BH              1.69.0-1    2019-01-07 [1] CRAN (R 3.5.2)
##  brmap         * 0.1.0       2019-03-04 [1] local         
##  class           7.3-15      2019-01-01 [2] CRAN (R 3.5.3)
##  classInt        0.4-1       2019-08-06 [1] CRAN (R 3.5.3)
##  cli             1.1.0       2019-03-19 [1] CRAN (R 3.5.3)
##  clipr           0.7.0       2019-07-23 [1] CRAN (R 3.5.3)
##  colorspace      1.4-1       2019-03-18 [1] CRAN (R 3.5.3)
##  crayon          1.3.4       2017-09-16 [1] CRAN (R 3.5.1)
##  curl            4.0         2019-07-22 [1] CRAN (R 3.5.3)
##  DBI             1.0.0       2018-05-02 [1] CRAN (R 3.5.1)
##  digest          0.6.20      2019-07-04 [1] CRAN (R 3.5.3)
##  dplyr         * 0.8.3       2019-07-04 [1] CRAN (R 3.5.3)
##  e1071           1.7-2       2019-06-05 [1] CRAN (R 3.5.3)
##  ellipsis        0.2.0.1     2019-07-02 [1] CRAN (R 3.5.3)
##  fansi           0.4.0       2018-10-05 [1] CRAN (R 3.5.1)
##  farver          1.1.0       2018-11-20 [1] CRAN (R 3.5.1)
##  geofacet      * 0.1.10      2019-03-13 [1] CRAN (R 3.5.3)
##  geogrid         0.1.1       2018-12-11 [1] CRAN (R 3.5.2)
##  gganimate     * 1.0.3       2019-04-02 [1] CRAN (R 3.5.3)
##  ggplot2       * 3.2.1       2019-08-10 [1] CRAN (R 3.5.3)
##  ggrepel         0.8.1       2019-05-07 [1] CRAN (R 3.5.3)
##  glue            1.3.1       2019-03-12 [1] CRAN (R 3.5.3)
##  gridExtra       2.3         2017-09-09 [1] CRAN (R 3.5.1)
##  gtable          0.3.0       2019-03-25 [1] CRAN (R 3.5.3)
##  hms             0.5.0       2019-07-09 [1] CRAN (R 3.5.3)
##  httr            1.4.1       2019-08-05 [1] CRAN (R 3.5.3)
##  imguR           1.0.3       2016-03-29 [1] CRAN (R 3.5.1)
##  jpeg            0.1-8       2014-01-23 [1] CRAN (R 3.5.0)
##  jsonlite        1.6         2018-12-07 [1] CRAN (R 3.5.2)
##  KernSmooth      2.23-15     2015-06-29 [2] CRAN (R 3.5.3)
##  labeling        0.3         2014-08-23 [1] CRAN (R 3.5.0)
##  lattice         0.20-38     2018-11-04 [2] CRAN (R 3.5.3)
##  lazyeval        0.2.2       2019-03-15 [1] CRAN (R 3.5.3)
##  magrittr        1.5         2014-11-22 [1] CRAN (R 3.5.1)
##  MASS            7.3-51.1    2018-11-01 [2] CRAN (R 3.5.3)
##  Matrix          1.2-17      2019-03-22 [1] CRAN (R 3.5.3)
##  mgcv            1.8-28      2019-03-21 [1] CRAN (R 3.5.3)
##  mime            0.7         2019-06-11 [1] CRAN (R 3.5.3)
##  munsell         0.5.0       2018-06-12 [1] CRAN (R 3.5.1)
##  nlme            3.1-137     2018-04-07 [2] CRAN (R 3.5.3)
##  openssl         1.4.1       2019-07-18 [1] CRAN (R 3.5.3)
##  pillar          1.4.2       2019-06-29 [1] CRAN (R 3.5.3)
##  pkgconfig       2.0.2       2018-08-16 [1] CRAN (R 3.5.1)
##  plogr           0.2.0       2018-03-25 [1] CRAN (R 3.5.1)
##  plyr            1.8.4       2016-06-08 [1] CRAN (R 3.5.1)
##  png             0.1-7       2013-12-03 [1] CRAN (R 3.5.0)
##  prettyunits     1.0.2       2015-07-13 [1] CRAN (R 3.5.1)
##  progress        1.2.2       2019-05-16 [1] CRAN (R 3.5.3)
##  purrr           0.3.2       2019-03-15 [1] CRAN (R 3.5.3)
##  R6              2.4.0       2019-02-14 [1] CRAN (R 3.5.2)
##  RColorBrewer    1.1-2       2014-12-07 [1] CRAN (R 3.5.0)
##  Rcpp            1.0.2       2019-07-25 [1] CRAN (R 3.5.3)
##  RcppArmadillo   0.9.600.4.0 2019-07-15 [1] CRAN (R 3.5.3)
##  readr         * 1.3.1       2018-12-21 [1] CRAN (R 3.5.2)
##  reshape2        1.4.3       2017-12-11 [1] CRAN (R 3.5.1)
##  rgeos           0.5-1       2019-08-05 [1] CRAN (R 3.5.3)
##  rlang           0.4.0       2019-06-25 [1] CRAN (R 3.5.3)
##  rnaturalearth   0.1.0       2017-03-21 [1] CRAN (R 3.5.1)
##  scales        * 1.0.0       2018-08-09 [1] CRAN (R 3.5.1)
##  sf            * 0.7-7       2019-07-24 [1] CRAN (R 3.5.3)
##  sp              1.3-1       2018-06-05 [1] CRAN (R 3.5.1)
##  stringi         1.4.3       2019-03-12 [1] CRAN (R 3.5.3)
##  stringr         1.4.0       2019-02-10 [1] CRAN (R 3.5.2)
##  sys             3.2         2019-04-23 [1] CRAN (R 3.5.3)
##  tibble          2.1.3       2019-06-06 [1] CRAN (R 3.5.3)
##  tidyselect      0.2.5       2018-10-11 [1] CRAN (R 3.5.1)
##  tweenr          1.0.1       2018-12-14 [1] CRAN (R 3.5.2)
##  units           0.6-3       2019-05-03 [1] CRAN (R 3.5.3)
##  utf8            1.1.4       2018-05-24 [1] CRAN (R 3.5.1)
##  vctrs           0.2.0       2019-07-05 [1] CRAN (R 3.5.3)
##  viridisLite     0.3.0       2018-02-01 [1] CRAN (R 3.5.1)
##  withr           2.1.2       2018-03-15 [1] CRAN (R 3.5.1)
##  zeallot         0.1.0       2018-01-28 [1] CRAN (R 3.5.2)
## 
## [1] C:/Users/Italo/Documents/R/win-library/3.5
## [2] C:/Program Files/R/R-3.5.3/library