Neste post, é apresentado como é simples criar um mapa coroplético com o ggplot2.
Aqui estão os pacotes que utilizaremos neste exemplo. Vamos carregar o tidyverse
que traz uma lista de pacotes que podem ser úteis. Além disso, o pacote sf
fornece uma função para leitura do shapefile que será plotado.
library(tidyverse)
library(sf)
Arquivos do tipo shapefile podem ser encontrados em várias fontes da internet. No caso de mapas do Brasil, a fonte indicada é o IBGE. O IBGE disponibiliza os shapefiles neste endereço.
Você pode entrar no link acima e baixar os mapas de interesse. Aqui, iremos baixar diretamente no R.
Você pode pular essa parte caso já tenha baixado os arquivos no seu computador. Primeiramente, vamos criar um diretório temporário e baixar o arquivo zip
nessa pasta.
br_ufs <- 'ftp://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2017/Brasil/BR/br_unidades_da_federacao.zip'
tmp_dir <- tempdir()
download.file(br_ufs, file.path(tmp_dir, 'br_unidades_da_federacao.zip'))
Após o download, iremos descompactar o arquivo zip nessa pasta temporária. O arquivo contém uma série de arquivos. O arquivo que nos interessa tem a extensão .shp
.
unzip(file.path(tmp_dir, 'br_unidades_da_federacao.zip'),
exdir = tmp_dir)
list.files(tmp_dir, pattern = "*.shp")
[1] "BRUFE250GC_SIR.shp"
O arquivo BRUFE250GC_SIR.shp
traz as informações necessárias para que o mapa seja plotado.
Vamos usar a função st_read()
do pacote sf
(simple features).
br_uf <- st_read(file.path(tmp_dir, "BRUFE250GC_SIR.shp"),
stringsAsFactors = FALSE)
Reading layer `BRUFE250GC_SIR' from data source `C:\Users\paulo\AppData\Local\Temp\RtmpEn90cG\BRUFE250GC_SIR.shp' using driver `ESRI Shapefile'
Simple feature collection with 27 features and 3 fields
geometry type: MULTIPOLYGON
dimension: XY
bbox: xmin: -73.99045 ymin: -33.75118 xmax: -28.83591 ymax: 5.271841
epsg (SRID): NA
proj4string: +proj=longlat +ellps=GRS80 +no_defs
br_uf
Simple feature collection with 27 features and 3 fields
geometry type: MULTIPOLYGON
dimension: XY
bbox: xmin: -73.99045 ymin: -33.75118 xmax: -28.83591 ymax: 5.271841
epsg (SRID): NA
proj4string: +proj=longlat +ellps=GRS80 +no_defs
First 10 features:
NM_ESTADO NM_REGIAO CD_GEOCUF
1 ACRE NORTE 12
2 ALAGOAS NORDESTE 27
3 AMAPÁ NORTE 16
4 AMAZONAS NORTE 13
5 BAHIA NORDESTE 29
6 CEARÁ NORDESTE 23
7 DISTRITO FEDERAL CENTRO-OESTE 53
8 ESPÍRITO SANTO SUDESTE 32
9 GOIÁS CENTRO-OESTE 52
10 MARANHÃO NORDESTE 21
geometry
1 MULTIPOLYGON (((-73.18253 -...
2 MULTIPOLYGON (((-35.46753 -...
3 MULTIPOLYGON (((-50.18123 1...
4 MULTIPOLYGON (((-67.32609 2...
5 MULTIPOLYGON (((-38.65484 -...
6 MULTIPOLYGON (((-40.49717 -...
7 MULTIPOLYGON (((-48.20054 -...
8 MULTIPOLYGON (((-40.39595 -...
9 MULTIPOLYGON (((-50.16015 -...
10 MULTIPOLYGON (((-43.99913 -...
class(br_uf)
[1] "sf" "data.frame"
Note que o objeto br_uf
possui a class data.frame. Logo, o ggplot2 saberá como tratá-lo. Cada linha possui uma columa geometry
que traz as informações sobre os limites de cada região.
Para plotar o gráfico com o ggplot2, iremos utilizar o objeto geométrico geom_sf()
. Esse objeto geométrico é utilizado nas visualizações de objetos da class sf
, o que é o caso do nosso objeto br_uf
. O mapeamento dos dados para os elementos estéticos (aes()
) é feito automaticamente.
ggplot(data = br_uf) +
geom_sf()
A ideia do mapa coroplético é que cada região (estado no nosso exemplo) apresente uma cor de preenchimento de acordo com uma variável.
A título de exemplo, vamos criar uma variável fictícia apenas para mostrar o funcionamento. Na prática, será preciso fazer um join com algum dado externo. É importante que esse dado tem alguma coluna que possa ser usada como chave na junção dos dados. Por exemplo, poderia ser usado um data.frame com as colunas NM_ESTADO
e TAXA_DESEMPREGO
.
br_uf <- br_uf %>%
mutate(SALARIO = rnorm(nrow(br_uf), mean = 1500, sd = 200))
br_uf
Simple feature collection with 27 features and 4 fields
geometry type: MULTIPOLYGON
dimension: XY
bbox: xmin: -73.99045 ymin: -33.75118 xmax: -28.83591 ymax: 5.271841
epsg (SRID): NA
proj4string: +proj=longlat +ellps=GRS80 +no_defs
First 10 features:
NM_ESTADO NM_REGIAO CD_GEOCUF SALARIO
1 ACRE NORTE 12 1278.210
2 ALAGOAS NORDESTE 27 1306.136
3 AMAPÁ NORTE 16 1380.608
4 AMAZONAS NORTE 13 1623.627
5 BAHIA NORDESTE 29 1579.192
6 CEARÁ NORDESTE 23 1350.264
7 DISTRITO FEDERAL CENTRO-OESTE 53 1759.505
8 ESPÍRITO SANTO SUDESTE 32 1471.604
9 GOIÁS CENTRO-OESTE 52 1637.488
10 MARANHÃO NORDESTE 21 1698.312
geometry
1 MULTIPOLYGON (((-73.18253 -...
2 MULTIPOLYGON (((-35.46753 -...
3 MULTIPOLYGON (((-50.18123 1...
4 MULTIPOLYGON (((-67.32609 2...
5 MULTIPOLYGON (((-38.65484 -...
6 MULTIPOLYGON (((-40.49717 -...
7 MULTIPOLYGON (((-48.20054 -...
8 MULTIPOLYGON (((-40.39595 -...
9 MULTIPOLYGON (((-50.16015 -...
10 MULTIPOLYGON (((-43.99913 -...
ggplot(data = br_uf, aes(fill = SALARIO)) +
geom_sf() +
labs(
title = "Exemplo de Mapa Coroplético",
subtitle = "Uso do objeto geométrico geom_sf()",
fill = "Salário"
) +
# A partir de agora são só ajustes do gráfico
theme_minimal() +
scale_fill_viridis_c()
Esse é o fim do nosso primeiro post! A ideia é que os posts sejam curtos e direto ao ponto. Espero que tenha ajudado!
For attribution, please cite this work as
Alencar (2018, Oct. 21). Bag of Posts: Mapa Coroplético com ggplot2. Retrieved from https://paulofelipe.github.io/bag_of_posts/posts/2018-10-21-mapa-coropltico-com-ggplot2/
BibTeX citation
@misc{alencar2018mapa, author = {Alencar, Paulo Felipe}, title = {Bag of Posts: Mapa Coroplético com ggplot2}, url = {https://paulofelipe.github.io/bag_of_posts/posts/2018-10-21-mapa-coropltico-com-ggplot2/}, year = {2018} }