knitr::opts_chunk$set(echo = TRUE)
devtools::load_all()
library(dplyr)
library(brazilmaps)
library(sf)
library(tmap)

Primeiro, vamos baixar os dados do Brasil.io por UF. Além dos pacotes coronabr e tmap, vamos carregar bibliotecas para lidar com mapas: brazilmaps, sf e tmap. Atenção: A partir da versão do R 4.0, o pacote brazilmaps deve ser instalado via github usando o pacote remotes.

library(coronabr)
library(dplyr)
library(brazilmaps) #usar remotes::install_github("rpradosiqueira/brazilmaps")
library(sf)
library(tmap)

Baixando os dados

Com a função get_corona_br é possível baixar os dados do portal Brasil.io. Usando o argumento by_uf = TRUE

dados <- get_corona_br(by_uf = TRUE)

Formatando os dados

A função format_corona_br() formata os dados para fazer um plot com o número de casos a cada 100.000 habitantes.

#at <- format_corona_br(dados)

Um mapa com o número de casos a cada 100 mil hab

Como os dados são atualizados o tempo todo, o código abaixo seleciona a data com entrada de dados mais completa.

# Pegando a data mais recente com os dados completos
# pode ser a data máxima, ou anterior à máxima
datas <- plyr::count(dados$date[dados$last_available_confirmed > 0 
                                       & !is.na(dados$state)])
datas$lag <- datas$freq - dplyr::lag(datas$freq)
if (datas$lag[which.max(datas$x)] < 0) {
  data_max <- max(datas$x, na.rm = TRUE) - 1
} else {
  data_max <- max(datas$x, na.rm = TRUE)
}

Aqui vamos mudar os nomes das colunas para facilitar a junção dos dados e o plot.

# proporcao de casos por 100k
dados_format <- dados %>%
  # renomeia colunas e arredonda casos
  mutate(`Casos (por 100 mil hab.)` = round(last_available_confirmed_per_100k_inhabitants),
         State = city_ibge_code) %>%
  # filtra para ultima data
  filter(date == data_max) 
# carregando shapefile br
br <- brazilmaps::get_brmap(geo = "State",
                            class = "sf")
# fazendo o merge dos dados e shapefile
br_sf <- sf::st_as_sf(br) %>%
  merge(dados_format, by = "State") %>% 
  dplyr::relocate(nome)

E agora fazendo o mapa com o pacote tmap.

# mapa
mapa <- tm_shape(br_sf) +
  #tm_fill() +
  tm_borders() +
  tm_symbols(size = "Casos (por 100 mil hab.)",
             col = "red",
             border.col = "red",
             scale = 2,
             alpha = 0.5)

mapa + tm_fill(alpha = .7)

É possível também fazer um mapa interativo, apenas mudando o tipo de saída em tmap.

tmap_mode("view")
mapa
df <- dados
map_corona_br <- function(df,
                          prop_pop = TRUE,
                          anim = FALSE,
                          dir = "figs"){
  # puxando a data mais atualizada
  datas <- plyr::count(df$date[df$last_available_confirmed > 0 & !is.na(df$state)])
  datas$lag <- datas$freq - dplyr::lag(datas$freq)
  if (datas$lag[which.max(datas$x)] < 0) {
    data_max <- max(datas$x, na.rm = TRUE) - 1
  } else {
    data_max <- max(datas$x, na.rm = TRUE)
  }
  if (anim == FALSE) {
  df <- df %>%
    filter(.data$date == data_max)
  }
  df$Casos <- df$last_available_confirmed
  # proporcao de casos por 100k
  df$`Casos (por 100 mil hab.)` <- df$last_available_confirmed_per_100k_inhabitants
  df$State <- df$city_ibge_code
  br <- brazilmaps::get_brmap(geo = "State",
                              class = "sf")

  br_sf <- sf::st_as_sf(br) %>%
    merge(df, by = "State")
  # mapa
  mapa <- tmap::tm_shape(br) +
    tmap::tm_fill(col = "white") +
    tmap::tm_borders() +
    tmap::tm_shape(br_sf) +
    tmap::tm_fill(colorNA = "white") +
    tmap::tm_borders() +
    if (prop_pop == TRUE) {
      tmap::tm_symbols(size = "Casos (por 100 mil hab.)",
                       col = "red",
                       border.col = "red",
                       scale = 2,
                       alpha = 0.7)
    } else {
      tmap::tm_symbols(size = "Casos",
                       col = "red",
                       border.col = "red",
                       scale = 2,
                       alpha = 0.7)
    }
  if (anim == TRUE) {
    anim <- mapa +
      tmap::tm_facets(along = "date", free.coords = FALSE)
    #ö: maybe animate here? i did that
    if (!dir.exists(dir)) {
      dir.create(dir)
    }
    anim <- tmap::tmap_animation(anim,
                                 filename = paste0(dir, "/", "anim.gif"),
                                 delay = 25,
                                 width = 1200,
                                 height = 1200,
                                 restart.delay = 50)
    return(anim)
  }
  mapa
}


liibre/corona documentation built on Feb. 4, 2021, 10:41 a.m.