Mapas em R com `geobr`
Licença
This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.
As ideias aqui expressas são de responsabilidade exclusiva do autor, e não representam as opiniões da instituição a que pertence.
Citação
Sugestão para citação:
FIGUEIREDO, Adriano Marcos Rodrigues. Mapas em R com geobr
. Campo Grande-MS,Brasil: RStudio/Rpubs, 2020. Disponível em http://rpubs.com/amrofi/maps_geobr e https://adrianofigueiredo.netlify.com/post/mapas-em-r-com-geobr/.
Script para reprodução (se utilizar, citar como acima)
Download 2020-01-31-mapas-em-r-com-geobr.RmdIntrodução
Para realizar seu mapa em R, inicialmente o leitor deve baixar os programas e pacotes necessários ao projeto. Neste caso, sugere-se que utilize o RStudio e o R atualizados, a partir de: http://cran.r-project.org/bin/windows/base/ e https://www.rstudio.com/products/rstudio/download3/. Quando esta revisão foi feita, a versão do RStudio era a RStudio Desktop 1.2.5033 e do R-3.6.1 for Windows (32/64 bit).
Primeiro instale o R e posteriormente o RStudio, de modo que o segundo reconheça automaticamente o primeiro. Se tudo estiver perfeito, a tela inicial do RStudio mostrará corretamente a versão do R.
Mapas em R
Agora a meta é gerar um mapa simples em R. Para tanto, primeiro define-se a malha municipal desejada. Para o presente caso, utilizam-se as malhas digitais do pacote geobr
.
Os pacotes (previamente instalados) são aqui carregados:
library(geobr)
## Loading required namespace: sf
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.0.2
library(sf)
## Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(rio)
library(readr)
O pacote geobr
tem as rotinas para o download dos mapas com divisões territoriais variadas. Faremos para os municípios de Mato Grosso do Sul (MS), malha com a estrutura municipal de 2018, contendo 79 municípios. É importante o leitor ter essa estrutura em mente, pois ao longo dos anos, municípios são criados a partir de desmembramentos de outros, não necessariamente respeitando limites de distritos ou outros atributos previamente definidos.
Este rápido exemplo faz uso das funções do pacote geobr
e assim, precisamos saber quais os códigos para cada estado. A função download_metadata()
permite encontrar os códigos para estado e ano e a desagregação desejada (município, estado etc).
metadata<-download_metadata() # para ver codigos
head(metadata)
Posso verificar que para MS, especificarei 50 e para o ano de 2018. Agora posso baixar os dados (shapes) para os municípios de Mato Grosso do Sul fazendo uso da função read_municipality(code_muni=50, year=2018)
em:
# não executei agora pois farei para 2010 mais a frente
all_mun_ms <- read_municipality(code_muni=50, year=2018)
O usuário que desejar baixar todos os municípios observará alguma demora no download dos dados, devido ao número de municípios e restrito à velocidade de sua internet.
A visualização da saída do objeto all_mun_ms
indica as variáveis armazenadas. É possível verificar que esse objeto é da classe sf
e data.frame
. Um objeto sf
contém uma coleção de recursos incluindo atributos e geometrias que contemplam os aspectos espaciais para desenhar o mapa.
class(all_mun_ms)
[1] "sf" "data.frame"
O dataset pode então ser observado. O dataset contém o código do município, o nome do município, o código do estado, a sigla do estado e aspectos geográficos como latitude, longitude dos vários segmentos que permitirão construir o mapa.
Agora vou construir uma variável para ser plotada no mapa. Preciso ter os meus dados em uma planilha em que uma das colunas será o código do município da mesma forma que consta em code_muni
no objeto all_mun_ms
. Recomendo fazer a associação entre os dados por meio do código, menos sujeito a erros de digitação que para os nomes dos municípios. Para este exemplo, baixei os dados de http://atlasbrasil.org.br/2013/pt/download/, ou mais precisamente em http://atlasbrasil.org.br/2013/data/rawData/atlas2013_dadosbrutos_pt.xlsx, o site oficial do PNUD para o Índice de Desenvolvimento Humano Municipal do Brasil, para 2013, que nesse caso se refere aos dados do censo demográfico 2010.
No caso, o arquivo Excel veio com dados de todo o Brasil e para os anos 1991, 2000 e 2010, mas fiz uma extração dos dados para apenas os municípios de MS e 2010. Observar que nesse caso tenho uma estrutura municipal de 78 municípios invés dos 79 de 2018.
# Executei uma vez e gerei dput para executar mais rapidamente conforme próximo chunk
library(readxl)
url <- "http://atlasbrasil.org.br/2013/data/rawData/atlas2013_dadosbrutos_pt.xlsx"
destfile <- "atlas2013_dadosbrutos_pt.xlsx"
#options(timeout= 4000000) # as vezes o site demora conforme sua internet
curl::curl_download(url, destfile)
atlas2013_dadosbrutos_pt <- read_excel(destfile,
sheet = "MUN 91-00-10")
dados_ms <- subset(atlas2013_dadosbrutos_pt, UF == '50' & ANO == '2010',
select=c(Codmun7,IDHM,IDHM_E,IDHM_L,IDHM_R))
print(dados_ms)
Segue o chunk para carregar dados de dados_ms
sem precisar acessar o arquivo mestre do chunk anterior. Gera os mesmos resultados acima, transformados a partir do dput()
de dados_ms
. Esta alternativa acelera a execução do script.
dados_ms<-structure(list(Codmun7 = c(5000203, 5000252, 5000609, 5000708,
5000807, 5000856, 5000906, 5001003, 5001102, 5001243, 5001508,
5001904, 5002001, 5002100, 5002159, 5002209, 5002308, 5002407,
5002605, 5002704, 5002803, 5002902, 5002951, 5003108, 5003157,
5003207, 5003256, 5003306, 5003454, 5003488, 5003504, 5003702,
5003751, 5003801, 5003900, 5004007, 5004106, 5004304, 5004403,
5004502, 5004601, 5004700, 5004809, 5004908, 5005004, 5005103,
5005152, 5005202, 5005251, 5005400, 5005608, 5005681, 5005707,
5005806, 5006002, 5006200, 5006259, 5006309, 5006358, 5006408,
5006606, 5006903, 5007109, 5007208, 5007307, 5007406, 5007505,
5007554, 5007695, 5007703, 5007802, 5007901, 5007935, 5007950,
5007976, 5008008, 5008305, 5008404), IDHM = c(0.67, 0.711, 0.673,
0.663, 0.67, 0.697, 0.643, 0.697, 0.688, 0.633, 0.681, 0.71,
0.684, 0.698, 0.666, 0.67, 0.701, 0.692, 0.703, 0.784, 0.647,
0.727, 0.754, 0.671, 0.589, 0.7, 0.706, 0.703, 0.694, 0.639,
0.699, 0.747, 0.684, 0.714, 0.66, 0.721, 0.675, 0.662, 0.681,
0.654, 0.62, 0.72, 0.526, 0.664, 0.712, 0.708, 0.623, 0.704,
0.672, 0.736, 0.632, 0.686, 0.7, 0.639, 0.694, 0.721, 0.649,
0.721, 0.588, 0.671, 0.701, 0.666, 0.664, 0.715, 0.709, 0.673,
0.651, 0.642, 0.729, 0.614, 0.682, 0.686, 0.681, 0.593, 0.651,
0.658, 0.744, 0.711), IDHM_E = c(0.518, 0.572, 0.546, 0.557,
0.538, 0.582, 0.526, 0.588, 0.562, 0.507, 0.537, 0.606, 0.559,
0.585, 0.573, 0.508, 0.57, 0.592, 0.596, 0.724, 0.522, 0.627,
0.665, 0.531, 0.417, 0.586, 0.606, 0.579, 0.595, 0.528, 0.597,
0.657, 0.577, 0.621, 0.511, 0.648, 0.549, 0.53, 0.531, 0.523,
0.479, 0.615, 0.337, 0.53, 0.595, 0.579, 0.485, 0.618, 0.545,
0.613, 0.507, 0.565, 0.597, 0.483, 0.554, 0.616, 0.523, 0.627,
0.444, 0.562, 0.598, 0.526, 0.519, 0.59, 0.585, 0.521, 0.491,
0.505, 0.608, 0.45, 0.576, 0.561, 0.557, 0.434, 0.545, 0.521,
0.645, 0.626), IDHM_L = c(0.823, 0.858, 0.818, 0.789, 0.826,
0.839, 0.799, 0.804, 0.84, 0.798, 0.848, 0.847, 0.814, 0.83,
0.776, 0.831, 0.837, 0.828, 0.817, 0.844, 0.826, 0.811, 0.85,
0.83, 0.806, 0.834, 0.811, 0.836, 0.81, 0.773, 0.809, 0.843,
0.824, 0.815, 0.83, 0.822, 0.826, 0.817, 0.846, 0.809, 0.772,
0.85, 0.791, 0.827, 0.845, 0.857, 0.77, 0.822, 0.822, 0.873,
0.782, 0.808, 0.803, 0.822, 0.809, 0.85, 0.798, 0.823, 0.811,
0.801, 0.812, 0.83, 0.83, 0.861, 0.869, 0.852, 0.83, 0.8, 0.85,
0.778, 0.825, 0.829, 0.803, 0.782, 0.769, 0.839, 0.849, 0.835
), IDHM_R = c(0.705, 0.733, 0.683, 0.663, 0.676, 0.692, 0.633,
0.717, 0.69, 0.628, 0.694, 0.698, 0.702, 0.699, 0.665, 0.714,
0.721, 0.676, 0.715, 0.79, 0.628, 0.756, 0.758, 0.684, 0.607,
0.701, 0.717, 0.719, 0.693, 0.64, 0.706, 0.753, 0.674, 0.719,
0.677, 0.705, 0.677, 0.671, 0.702, 0.66, 0.645, 0.715, 0.547,
0.668, 0.718, 0.716, 0.646, 0.687, 0.676, 0.744, 0.638, 0.707,
0.715, 0.658, 0.746, 0.716, 0.656, 0.727, 0.566, 0.672, 0.708,
0.677, 0.681, 0.72, 0.702, 0.686, 0.676, 0.655, 0.751, 0.66,
0.668, 0.694, 0.706, 0.615, 0.657, 0.651, 0.752, 0.689)), row.names = c(NA,
-78L), class = c("tbl_df", "tbl", "data.frame"))
Segue o chunk para opção de download manual e armazenamento em seu diretório.
# trazendo os dados do Brasil todo apenas para municipios
library(readxl)
atlas2013_dadosbrutos_pt <- read_excel("atlas2013_dadosbrutos_pt.xlsx",
sheet = "MUN 91-00-10")
# reduzir linhas para 2010 e MS
# usando a funcao subset para pegar as colunas de IDH até a última ()
dados_ms <- subset(atlas2013_dadosbrutos_pt, UF == '50' & ANO == '2010',
select=c(Codmun7,IDHM,IDHM_E,IDHM_L,IDHM_R))
print(dados_ms)
Precisarei portanto da estrutura de 2010 para compatibilizar o mapa. A execução normal do próximo chunk mostraria o andamento do download da estrutura de 2010, mas em meu markdown solicitei para ‘hide’ para economizar espaço do post.
library(geobr)
# sugiro permanecer o timeout anterior, options(timeout= 4000000)
all_mun_ms <- read_municipality(code_muni=50, year=2010)
## Using year 2010
Juntarei os datasets pela condição de que o code_muni
do objeto all_mun_ms
é igual ao Codmun7
do objeto dados_ms
.
dataset_final = left_join(all_mun_ms, dados_ms, by=c("code_muni"="Codmun7"))
max(dataset_final$IDHM) # 0.784
## [1] 0.784
min(dataset_final$IDHM) # 0.526
## [1] 0.526
ggplot() +
geom_sf(data=dataset_final, aes(fill=IDHM), color= NA, size=.15)+
labs(title="IDHM 2013 (ano base 2010) dos Municipíos de MS",
caption='Fonte: Elaboração própria', size=8)+
scale_fill_distiller(palette = "Greens", limits=c(0.5, 0.8),
name="Code_muni")+
theme_minimal()
Sendo um mapa feito em ggplot2
pelos comandos ggplot() + geom_sf(data=dataset_final, aes(fill=IDHM), color= NA, size=.15)
, o padrão é um mapa na escala azul. Ou seja, fazendo agora um mapa para o IDHM_E (IDHM Educação), recomendo o usuário fazer o passo a passo de modo a ver exatamente o que o código realiza:
#dataset_final = left_join(all_mun_ms, dados_ms, by=c("code_muni"="Codmun7"))
max(dataset_final$IDHM_E) # 0.724
## [1] 0.724
min(dataset_final$IDHM_E) # 0.337
## [1] 0.337
ggplot() +
geom_sf(data=dataset_final, aes(fill=IDHM_E), color= NA, size=.15)
Veja que o mapa anterior saiu em azul, sem rótulos. Observe que nesse caso e no próximo, não fiz nenhuma restrição à legenda.
O próximo sai com rótulos do título e nota ao final do mapa.
ggplot() +
geom_sf(data=dataset_final, aes(fill=IDHM_E), color= NA, size=.15)+
labs(title="IDHM Educação 2013 (ano base 2010) dos Municipíos de MS",
caption='Fonte: Elaboração própria', size=8)
Para o próximo mapa, coloco a palheta de cores em vermelho e os limites para as classes, agora de 0 a 1.
ggplot() +
geom_sf(data=dataset_final, aes(fill=IDHM_E), color= NA, size=.15)+
labs(title="IDHM Educação 2013 (ano base 2010) dos Municipíos de MS",
caption='Fonte: Elaboração própria', size=8)+
scale_fill_distiller(palette = "Reds", limits=c(0.0, 1.0),
name="Code_muni")
No exemplo abaixo faço um caso particular em que um município, o de máximo IDHM_E ficou excluído por uma restrição ao delimitar o máximo da palheta em 0.7 (o valor seria de Campo Grande, 0.724, maior que 0.7). Portanto, o município ficou em preto.
ggplot() +
geom_sf(data=dataset_final, aes(fill=IDHM_E), color= NA, size=.15)+
labs(title="IDHM Educação 2013 (ano base 2010) dos Municipíos de MS",
caption='Fonte: Elaboração própria', size=8)+
scale_fill_distiller(limits=c(0.3, 0.7))+
theme_minimal()
Outras palhetas de cores pode ser visualizada em http://www.sthda.com/english/wiki/ggplot2-colors-how-to-change-colors-automatically-and-manually.
# dataset_final = left_join(all_mun_ms, dados_ms, by=c("code_muni"="Codmun7"))
# max(dataset_final$IDHM) # 0.784
# min(dataset_final$IDHM) # 0.526
ggplot() +
geom_sf(data=dataset_final, aes(fill=IDHM), color= NA, size=.15)+
labs(title="IDHM 2013 (ano base 2010) dos Municipíos de MS",
caption='Fonte: Elaboração própria', size=8)+
scale_fill_distiller(palette = "RdGy", limits=c(0.5, 0.8),
name="Code_muni")+
theme_minimal()