Mapa Coroplético com ggplot2

Neste post, é apresentado como é simples criar um mapa coroplético com o ggplot2.

Paulo Felipe Alencar https://github.com/paulofelipe
10-21-2018

Pacotes

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)

Obtendo Shapefiles

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.

Lendo o Shapefile

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.

Plotando o mapa com o ggplot2

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()

Preenchendo as Regiões

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!

Citation

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}
}