# Para instalar o D3plusR:
# devtools::install_github('paulofelipe/D3plusR')
library(geobr)
library(geojsonio)
library(sf)
library(D3plusR)
library(readxl)
library(janitor)
library(dplyr)Visualizações de mapas interativos com o D3plusR
Integrando o D3plusR com o geobr
Introdução
Este post tem o objetivo de mostrar a solução encontrada para uma questão levantada no repositório do D3plusR (aqui). O autor da issue gostaria de saber se seria possível integrar as bases de dados espaciais do pacote geobr com o D3plusR. A resposta é sim! E é isso que vamos ver neste post. Apenas uma ressalva, como não sou especialista em dados espaciais, é possível que essa não seja a solução mais eficiente para o problema. Se você tem conhecimento sobre uma solução mais elegante, você pode compartilhar aqui ou no github.
Pacotes
Abaixo, estão listados os pacotes utilizados neste post.
Dados
Para o exemplo, irei utilizar os dados do Censo 2010 por microrregião disponibilizados pelo IPEA (Ipea Geo). Especificamente, iremos calcular a proporção da população rural em relação ao total por microrregião.
temp_file <- tempfile()
download.file(
url = "https://www.ipea.gov.br/ipeageo/arquivos/bases/IBGE_CIDADES_MICROREGIAO.xls",
destfile = temp_file,
mode = "wb"
)
dados_censo2010 <- read_excel(
path = temp_file,
sheet = "Censo 2010 (Sinopse)"
) %>%
clean_names() %>%
select(
codigo_da_microregiao, populacao_residente, populacao_residente_rural
) %>%
mutate(prop_rural = populacao_residente_rural / populacao_residente * 100)Obtendo o mapa
Para a criação de um geo_map no D3plusR, é preciso de dados no formato topojson. O código abaixo lê os dados espaciais para as microrregiões brasileiras e converte para o formato topojson.
# Prepara o mapa ---------------------------------------------------------------
mapa <- read_micro_region(year = 2010, simplified = TRUE) %>%
st_transform(4326) %>%
transmute(id = code_micro, name_micro) %>%
topojson_json(
object_name = "BRMI",
geometry = "polygon",
type = "GeometryCollection",
quantization = 1e4,
crs = 4326
) %>%
fromJSON(., simplifyVector = TRUE)
# Cada "geometria" precisa ter um id. Adicionamos a partir das propriedades.
mapa$objects$BRMI$geometries$id <-
mapa$objects$BRMI$geometries$properties$id
# Salva o mapa em um arquivo json para uso futuro sem necessidade de repetir
# o processo acima
mapa <- write_json(mapa, "./br_micro.json")O código abaixo faz um join com as propriedades da microrregiões para adicionar os nomes de cada microrregião no data.frame dados_censo2010.
mapa <- read_json("./br_micro.json", simplifyVector = TRUE)Criando a visualização
O código abaixo cria a visualização usando o pacote D3plusR. O importante é que a variável indicada como id no data.frame dados_censo2010 tenha os mesmos códigos que estão no arquivo do mapa. No exemplo, são os códigos de microrregiões. Para mais detalhes sobre a utilização do D3plusR, veja este tutorial.
# Join para adicionar o nome das regiões aos dados
dados_censo2010 <- dados_censo2010 %>%
left_join(
y = mapa$objects$BRMI$geometries$properties,
by = c("codigo_da_microregiao" = "id")
) %>%
rename(id = codigo_da_microregiao)
head(dados_censo2010)# A tibble: 6 × 5
id populacao_residente populacao_residente_rural prop_rural name_micro
<dbl> <dbl> <dbl> <dbl> <chr>
1 11001 540320 85875 15.9 Porto Velho
2 11002 71369 20438 28.6 Guajará-Mirim
3 11003 171150 56535 33.0 Ariquemes
4 11004 295466 92554 31.3 Ji-Paraná
5 11005 70184 40113 57.2 Alvorada D'oes…
6 11006 228212 76457 33.5 Cacoal
d3plus(
data = dados_censo2010,
type = "geo_map",
id = "id",
width = "100%",
height = 700,
percent_var = "prop_rural",
locale = "pt_BR",
dictionary = list(prop_rural = "Proporção da população rural"),
) %>%
d3plusCoords(mapa, projection = "equirectangular") %>%
d3plusColor(value = "prop_rural") %>%
d3plusTooltip(value = "prop_rural") %>%
d3plusText(value = "name_micro") %>%
d3plusTitle(
value = "Proporção da população rural por microrregião - 2010",
font = list(size = 28, weight = 900)
)