Animando gráficos feitos em ggplot2: o pacote gganimate

Você provavelmente conhece o pacote ggplot2, mas você sabia que também é possível criar gráficos animados sem nenhuma dificuldade? Essa é exatamente a função do pacote gganimate e hoje nós vamos conversar um pouco sobre as animações.

Ideia geral

O pacote gganimate parte de um objeto ggplot2 que pode ser decomposto em vários plots repetidos. A animação que vemos na tela é uma composição a partir de todas essas imagens. As possibilidades de composição são definidas pelas chamadas à funções transition_*, que definem de que modo a sua animação deve ser se comportar entre um gráfico e outro. Você pode conferir a nossa live ou o cheatsheet para ver alguns exemplos.

O exemplo abaixo usa transition_reveal(data_aplicacao) do pacote gganimate para transformar um ggplot2 comum em várias imagens que representam a curva de pessoas vacinadas ao longo do tempo:

library(tidyverse)
library(bigrquery)

conexao_covid <- dbConnect(
  bigrquery::bigquery(),
  project = "basedosdados",
  dataset = "br_ms_vacinacao_covid19",
  billing = "live-curso-r-bd-2"
)

conexao_populacao <- dbConnect(
  bigrquery::bigquery(),
  project = "basedosdados",
  dataset = "br_ibge_populacao",
  billing = "live-curso-r-bd-2"
)

vacinacao_base <- tbl(conexao_covid, "microdados_vacinacao") %>%
  count(sigla_uf, data_aplicacao, dose) %>%
  collect() %>%
  mutate(
    data_aplicacao = as.Date(data_aplicacao)
  )

populacao_estados <- tbl(conexao_populacao, "municipio") %>%
  filter(ano == 2020) %>%
  collect() %>%
  mutate(
    id_estado = str_sub(id_municipio, 1, 2),
    sigla_uf = case_when(
      id_estado == "12" ~ "AC",
      id_estado == "27" ~ "AL",
      id_estado == "16" ~ "AP",
      id_estado == "13" ~ "AM",
      id_estado == "29" ~ "BA",
      id_estado == "53" ~ "DF",
      id_estado == "23" ~ "CE",
      id_estado == "32" ~ "ES",
      id_estado == "52" ~ "GO",
      id_estado == "21" ~ "MA",
      id_estado == "51" ~ "MT",
      id_estado == "50" ~ "MS",
      id_estado == "31" ~ "MG",
      id_estado == "15" ~ "PA",
      id_estado == "25" ~ "PB",
      id_estado == "41" ~ "PR",
      id_estado == "26" ~ "PE",
      id_estado == "22" ~ "PI",
      id_estado == "33" ~ "RJ",
      id_estado == "24" ~ "RN",
      id_estado == "43" ~ "RS",
      id_estado == "11" ~ "RO",
      id_estado == "14" ~ "RR",
      id_estado == "42" ~ "SC",
      id_estado == "35" ~ "SP",
      id_estado == "28" ~ "SE",
      id_estado == "17" ~ "TO"
    )
  ) %>%
  group_by(sigla_uf) %>%
  summarise(
    populacao = sum(populacao)
  )

vacinacao_base_por_estado <- vacinacao_base %>%
  ungroup() %>%
  mutate(
    regiao = case_when(
      sigla_uf %in% c("SP", "RJ", "MG", "ES") ~ "Sudeste",
      sigla_uf %in% c("SC", "PR", "RS") ~ "Sul",
      sigla_uf %in% c("MT", "DF", "GO", "MS") ~ "Centro-Oeste",
      sigla_uf %in% c("AC", "AM", "RO", "RR", "PA", "AP", "TO") ~ "Norte",
      TRUE ~ "Nordeste"
    )
  ) %>%
  filter(dose == "2") %>%
  group_by(regiao, sigla_uf) %>%
  arrange(regiao, sigla_uf, data_aplicacao) %>%
  mutate(
    n_acum = cumsum(n),
  ) %>%
  filter(data_aplicacao >= as.Date("2021-01-01")) %>%
  left_join(
    populacao_estados
  ) %>%
  mutate(
    percentual_vacinado = n_acum/populacao
  )

populacao_regiao <- vacinacao_base_por_estado %>%
  group_by(regiao) %>%
  summarise(
    populacao = sum(unique(populacao))
  )

vacinacao_base_por_regiao <-  vacinacao_base %>%
  ungroup() %>%
  mutate(
    regiao = case_when(
      sigla_uf %in% c("SP", "RJ", "MG", "ES") ~ "Sudeste",
      sigla_uf %in% c("SC", "PR", "RS") ~ "Sul",
      sigla_uf %in% c("MT", "DF", "GO", "MS") ~ "Centro-Oeste",
      sigla_uf %in% c("AC", "AM", "RO", "RR", "PA", "AP", "TO") ~ "Norte",
      TRUE ~ "Nordeste"
    )
  ) %>%
  filter(dose == "2") %>%
  group_by(regiao, data_aplicacao) %>%
  summarise(
    n = sum(n)
  ) %>%
  group_by(regiao) %>%
  arrange(regiao, data_aplicacao) %>%
  mutate(
    n_acum = cumsum(n),
  ) %>%
  filter(data_aplicacao >= as.Date("2021-02-01")) %>%
  left_join(
    populacao_regiao
  ) %>%
  mutate(
    percentual_vacinado = n_acum/populacao
  )

library(gganimate)

grafico_por_regiao <- vacinacao_base_por_regiao %>%
  #filter(regiao == "Sudeste") %>%
  #filter(data_aplicacao <= as.Date("2021-04-15")) %>%
  ungroup() %>%
  arrange(data_aplicacao) %>%
  #mutate(data_aplicacao = as.numeric(data_aplicacao)) %>%
  ggplot(aes(x = data_aplicacao, y = percentual_vacinado, color = regiao)) +
  #geom_col() +
  #geom_line(size = 1.2) +
  geom_point(size = 6) +
  transition_reveal(data_aplicacao) +
  scale_color_viridis_d() +
  theme_bw(20) +
  shadow_wake(wake_length = 0.5, size = 3) +
  ease_aes("cubic-in") +
  labs(x = "Data de referência", y= "% da população vacinado com a 2a dose",
       titulo = "Evolução da vacinação contra COVID-19 no Brasil por região",
       caption = "Fonte: openDataSus/Base dos dados")

animate(grafico_por_regiao, height = 600, width =800)

Gostou? Quer saber mais?

Confira a nossa live!

Se você quiser aprender um pouco mais sobre RMarkdown e Visualização de Dados em geral, dê uma olhada no nosso curso Relatórios e visualização de dados e aproveite!

comments powered by Disqus