8 Dados quantitativos absolutos: mapa das figuras geométricas proporcionais
Quando queremos transcrever graficamente dados quantitativos ou numéricos que expressam uma medida ou contagem, dois tipos de representação cartográfica são indicadas: o mapa de figuras geométricas proporcionais e o mapa dos pontos de contagem (também conhecido por densidade de pontos). A escolha pela utilização de um ou outro depende do tipo de fenômeno a ser representado e da magnitude dos valores. As figuras geométricas proporcionais (em geral, o círculo é a figura mais utilizada) utilizam a variável visual “tamanho” e permitem perceber diferenças entre as proporções de forma imediata. Os pontos de contagem também utilizam a variável visual “tamanho” e possibilitam estabelecer relação entre a variável de interesse e a área do polígono, remetendo à ideia de densidade.
Neste tópico trataremos da representação por meio de círculos proporcionais da população do estado de São Paulo em 2022, segundo município. Como os dados de população correspondem a cada município como um todo (área urbana e rural), o círculo deverá estar localizado nas coordenadas dos centróides dos municípios.
8.1 Bases de dados
Iniciamos limpando a memória.
Definimos com setwd()
e verificamos o diretório de trabalho com getwd()
.
Para evitar textos com erros devido à acentuação, vamos ajustar para a língua portuguesa.
#para ajustar a língua para português usando a função
Sys.setlocale(category = "LC_ALL", locale = "pt_BR.UTF-8")
## [1] "LC_COLLATE=pt_BR.UTF-8;LC_CTYPE=pt_BR.UTF-8;LC_MONETARY=pt_BR.UTF-8;LC_NUMERIC=C;LC_TIME=pt_BR.UTF-8"
Outro ajuste importante será a desativação da notação científica dos números na legenda.
Carregamos os pacotes que serão utilizados.
#para carregar os pacotes que serão usados
library(sf)
library(geobr)
library(ggplot2,warn.conflicts=FALSE)
library(scales)
Usaremos a base de dados de população do Portal da Fundação SEADE. Para baixar o arquivo compactado, usamos a linha de código a seguir.
#para identificar o url, faca o download do arquivo shapefile e clique em Ctrl+J
download.file(url = "https://repositorio.seade.gov.br/dataset/9bb4f8ef-f1a4-4734-92a2-814cfc8d0974/resource/09ba3695-a6a1-44ab-9916-fd1a8aa1c980/download/populacao.zip", destfile = "Populacao.zip")
Para descompactar o arquivo, usamos a função unzip.
Na sequência, criamos o objeto pop usando a função para leitura de arquivo do tipo shapefile.
## Reading layer `Populacao' from data source
## `C:\Users\l_viz\Documents\RCartoTematica\Populacao.shp' using driver `ESRI Shapefile'
## Simple feature collection with 645 features and 12 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -53.10487 ymin: -25.30835 xmax: -44.1634 ymax: -19.78045
## Geodetic CRS: SIRGAS 2000
Podemos ver as colunas de pop com a função names(pop).
## [1] "Cod_ibge" "Nome" "Rotulo" "Area_Km2" "Den_Demo" "Pop" "RA" "RG"
## [9] "RM" "AU" "RGI" "RGINT" "geometry"
O objeto pop está na projeção cartográfica SIRGAS 2000. Vamos passá-lo para WGS84 pseudo Mercator (CRS = 3857).
#para transformar para a projeção em WGS84 pseudo Mercator (crs=3857)
pop_wgs84 <- st_transform(pop, crs= 3857)
Vamos precisar dos polígonos das Unidades da Federação, que podem ser obtidos no site do IBGE.
#para identificar o url, faca o download do arquivo shapefile e clique em Ctrl+J
download.file(url = "https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2020/Brasil/BR/BR_UF_2020.zip", destfile = "BR_UF_2020.zip")
Usamos a função unzip para extrair o arquivo.
Para ler o arquivo no R, usamos st_read.
## Reading layer `BR_UF_2020' from data source
## `C:\Users\l_viz\Documents\RCartoTematica\BR_UF_2020.shp' using driver `ESRI Shapefile'
## Simple feature collection with 27 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -73.99045 ymin: -33.75118 xmax: -28.84764 ymax: 5.271841
## Geodetic CRS: SIRGAS 2000
Para que fiquem na mesma projeção, transformamos UFBR para WGS84 pseudo Mercator.
Podemos verificar o tipo de geometria do objeto pop_wgs84 usando a função st_geometry_type.
## [1] MULTIPOLYGON
## 18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT MULTILINESTRING ... TRIANGLE
8.2 Centroides dos municípios
Para utilizarmos os círculos proporcionais, precisaremos gerar as coordenadas dos centroides dos polígonos dos municípios, criando um objeto com geometria de ponto. Isto pode ser feito com a função st_centroid.
#para criar o objeto 'pop_centrd' que contém os pontos dos centroides
pop_centrd = st_centroid(pop_wgs84)
Conferimos o tipo de geometria de pop_centrd.
## [1] POINT
## 18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT MULTILINESTRING ... TRIANGLE
Temos agora três camadas que serão usadas para a elaboração do mapa, que deverão ser adicionadas na seguinte ordem:
Unidades da Federação: UFBRwgs84;
Arquivo dos polígonos dos municípios do estado de São Paulo com os dados das populações de todos os municípios: pop_wgs84
Arquivo de pontos das coordenadas dos centroides dos municípios: pop_centrd.
8.3 Mapa da população do estado de São Paulo
Vamos usar o pacote ggplot2 para fazer o mapa (Figura 8.1). Começamos adicionando a camada das UFs, preenchendo com cinza claro (fill = “gray95”) e contorno com cinza médio (colour = “grey50”). Alpha varia de 0 a 1, sendo 1 o valor para indicar nenhuma transparência.
#para plotar o mapa das UFs do Brasil
ggplot() +
geom_sf(data = UFBRwgs84, colour = "grey50", fill = "gray95", alpha = 0.8)
Adicionamos a segunda camada, escolhendo a cor de preenchimento dos polígonos dos municípios (fill = “beige”), do contorno (color = “black”) e espessura da linha de contorno (size = 0.25) (Figura 8.2).
#para plotar o mapa das UFs e dos municípios da UF São Paulo
ggplot() +
geom_sf(data = UFBRwgs84, colour = "grey50", fill = "gray95", alpha = 0.8)+
geom_sf(data = pop_wgs84, fill = "beige", color = "black", size = 0.25)
A terceira camada, os pontos sobre os quais serão desenhados os círculos proporcionais, deverá indicar qual variável será mapeada como círculo (size = Pop). Lembre-se que o nome da coluna não vem entre aspas. A cor (color = “tomato”), a transparência (alpha = 0.8) e se a legenda deverá aparecer são definidos na mesma camada (Figura 8.3).
#para plotar o mapa das UFs, dos municípios da UF São Paulo e centroides com dados da população
ggplot() +
geom_sf(data = UFBRwgs84, colour = "grey50", fill = "gray95", alpha = 0.8)+
geom_sf(data = pop_wgs84, fill = "beige", color = "black", size = 0.25) +
geom_sf(data = pop_centrd, aes(size = Pop), color = "tomato", alpha=0.8, show.legend = "point")
Após a definição das camadas, outras configurações podem ser feitas. Vamos definir as características relacionadas aos círculos. Para isso, usamos a função scale_size. Definimos o título que acompanha a legenda (name = “Habitantes”), a faixa dos tamanhos dos círculos (o menor como 0 e o maior como 10) (range = c(0, 10)) e os cortes dos tamanhos dos círculos (breaks = c(10000, 100000, 1000000, 10000000)) (Figura 8.4).
#para plotar o mapa das UFs, dos municípios da UF São Paulo, centroides com dados da população e ajustar a legenda
ggplot() +
geom_sf(data = UFBRwgs84, colour = "grey50", fill = "gray95", alpha = 0.8)+
geom_sf(data = pop_wgs84, fill = "beige", color = "black", size = 0.25) +
geom_sf(data = pop_centrd, aes(size = Pop), color = "tomato", alpha=0.8, show.legend = "point")+
scale_size(name="Habitantes", range = c(0, 10), breaks = c(10000, 100000, 1000000, 10000000))
Acrescentamos o título do mapa (ggtitle(“População do estado de São Paulo em 2022”)) (Figura 8.5).
#para plotar o mapa das UFs, dos municípios da UF São Paulo, centroides com dados da população, ajustar a legenda e adicionar o título
ggplot() +
geom_sf(data = UFBRwgs84, colour = "grey50", fill = "gray95", alpha = 0.8)+
geom_sf(data = pop_wgs84, fill = "beige", color = "black", size = 0.25) +
geom_sf(data = pop_centrd, aes(size = Pop), color = "tomato", alpha=0.8, show.legend = "point")+
scale_size(name="Habitantes", range = c(0, 10), breaks = c(10000, 100000, 1000000, 10000000))+
ggtitle("População do estado de São Paulo em 2022")
Em relação aos elementos da moldura do mapa, usamos a função theme. Vamos definir a cor de fundo em azul claro para remeter ao Oceano (panel.background = element_rect(fill = “aliceblue”)). Quanto ao título do mapa (plot.title), vamos ajustar o tamanho da fonte e a posição na área do mapa (element_text(size = 11, hjust = 0.9, vjust = -10)). Em relação à linha da moldura (panel.border), vamos indicar a cor preta, espessura da linha (0.1) e que não deverá haver preenchimento (NA) ( element_rect(color = “black”, linewidth = .1, fill = NA)) (Figura 8.5).
#para plotar o mapa das UFs, dos municípios da UF São Paulo, centroides com dados da população, ajustar a legenda, adicionar o título e definir o tema
ggplot() +
geom_sf(data = UFBRwgs84, colour = "grey50", fill = "gray95", alpha = 0.8)+
geom_sf(data = pop_wgs84, fill = "beige", color = "black", size = 0.25) +
geom_sf(data = pop_centrd, aes(size = Pop), color = "tomato", alpha=0.8, show.legend = "point")+
scale_size(name="Habitantes", range = c(0, 10), breaks = c(10000, 100000, 1000000, 10000000))+
ggtitle("População do estado de São Paulo em 2022")+
theme(panel.background = element_rect(fill = "aliceblue"),
plot.title = element_text(size = 11, hjust = 0.9, vjust = -10),
panel.border = element_rect(color = "black",linewidth = .1,fill = NA))
Precisamos definir a área do mapa. Vamos restringir os limites para incluir uma área levemente maior do que o estado de São Paulo, usando a função coord_sf. Para saber os limites do estado de São Paulo, vamos olhar o objeto pop_wgs84.
Os limites de pop_wgs84 são:
Bounding box: xmin: -5911607 ymin: -2913666 xmax: -4916247 ymax: -2247040
Vamos ampliar um pouco esta área para:
xlim = c(-5950000, -4890000), ylim = c(-2950000, -2160000)
#para plotar o mapa das UFs, dos municípios da UF São Paulo, centroides com dados da população, ajustar a legenda, adicionar o título, definir o tema e os limites
ggplot() +
geom_sf(data = UFBRwgs84, colour = "grey50", fill = "gray95", alpha = 0.8)+
geom_sf(data = pop_wgs84, fill = "beige", color = "black", size = 0.25) +
geom_sf(data = pop_centrd, aes(size = Pop), color = "tomato", alpha=0.8, show.legend = "point")+
scale_size(name="Habitantes", range = c(0, 10), breaks = c(10000, 100000, 1000000, 10000000))+
ggtitle("População do estado de São Paulo em 2022")+
theme(panel.background = element_rect(fill = "aliceblue"),
plot.title = element_text(size = 11, hjust = 0.9, vjust = -10),
panel.border = element_rect(color = "black", linewidth = .1,fill = NA))+
coord_sf(xlim = c(-5950000, -4890000), ylim = c(-2950000, -2160000), expand = FALSE)
Vamos posicionar a legenda na área interna da moldura e adicionar outras informações como a fonte dos dados e os créditos de elaboração do mapa.
#para plotar o mapa das UFs, dos municípios da UF São Paulo, centroides com dados da população, ajustar a legenda, adicionar o título, definir o tema, alterar posição da legenda e adicionar notas de rodapé
ggplot() +
geom_sf(data = UFBRwgs84, colour = "grey50", fill = "gray95", alpha = 0.8)+
geom_sf(data = pop_wgs84, fill = "beige", color = "black", size = 0.25) +
geom_sf(data = pop_centrd, aes(size = Pop), color = "tomato", alpha=0.8, show.legend = "point")+
scale_size(name="Habitantes", range = c(0, 10), breaks = c(10000, 100000, 1000000, 10000000))+
ggtitle("População do estado de São Paulo em 2022")+
theme(panel.background = element_rect(fill = "aliceblue"),
plot.title = element_text(size = 11, hjust = 0.9, vjust = -10),
panel.border = element_rect(color = "black",linewidth = .1,fill = NA))+
coord_sf(xlim = c(-5950000, -4890000), ylim = c(-2950000, -2160000), expand = FALSE)+
theme(legend.position = c(0.2, 0.2))+
labs(caption = "Fonte: SEADE (2022) \n
Elaborado por: @Ligiaviz")
A escala gráfica será adicionada com a função annotation_scale do pacote ggspatial. Usamos :: para indicar o pacote e a função. A localização da barra de escala deve ser indicada pela posição em cima ou embaixo combinada com a posição esquerda ou direita. Embaixo é indicado por “bottom” ou simplesmente “b”; em cima por “top” ou “t”; do lado direito (“rigth” ou “r”) ou do lado esquerdo (“left” ou “l”). Podemos ajustar a espessura do traço, a largura e altura da barra e quanto vale a unidade em centímetros.
# a última linha adiciona a barra de escala
ggplot() +
geom_sf(data = UFBRwgs84, colour = "grey50", fill = "gray95", alpha = 0.8)+
geom_sf(data = pop_wgs84, fill = "beige", color = "black", size = 0.25) +
geom_sf(data = pop_centrd, aes(size = Pop), color = "tomato", alpha=0.8, show.legend = "point")+
scale_size(name="Habitantes", range = c(0, 10), breaks = c(10000, 100000, 1000000, 10000000))+
ggtitle("População do estado de São Paulo em 2022")+
theme(panel.background = element_rect(fill = "aliceblue"),
plot.title = element_text(size = 11, hjust = 0.9, vjust = -10),
panel.border = element_rect(color = "black",linewidth = .1,fill = NA))+
coord_sf(xlim = c(-5950000, -4890000), ylim = c(-2950000, -2160000), expand = FALSE)+
theme(legend.position = c(0.2, 0.2))+
labs(caption = "Fonte: SEADE (2022) \n
Elaborado por: @Ligiaviz")+
ggspatial::annotation_scale(location = "br", width_hint = 0.4, line_width = 0.5, height = unit(0.1,"cm"))
Por fim, vamos acrescentar a seta do norte geográfico. Usaremos ggspatial::annotation_north_arrow. Indicaremos a posição no mapa (location = “tr”), o tipo de norte (which_north = “true”), o tamanho e a unidade (pad_x = unit(0.4, “in”), pad_y = unit(0.4, “in”)), o estilo da seta, as cores de preenchimento e da linha e o estilo do texto para a letra N.
#o último bloco adiciona e configura a seta do Norte Geográfico
ggplot() +
geom_sf(data = UFBRwgs84, colour = "grey50", fill = "gray95", alpha = 0.8)+
geom_sf(data = pop_wgs84, fill = "beige", color = "black", size = 0.25) +
geom_sf(data = pop_centrd, aes(size = Pop), color = "tomato", alpha=0.8, show.legend = "point")+
scale_size(name="Habitantes", range = c(0, 10), breaks = c(10000, 100000, 1000000, 10000000))+
ggtitle("População do estado de São Paulo em 2022")+
theme(panel.background = element_rect(fill = "aliceblue"),
plot.title = element_text(size = 11, hjust = 0.9, vjust = -10),
panel.border = element_rect(color = "black",linewidth = .1,fill = NA))+
coord_sf(xlim = c(-5950000, -4890000), ylim = c(-2950000, -2160000), expand = FALSE)+
theme(legend.position = c(0.2, 0.2))+
labs(caption = "Fonte: SEADE (2022) \n
Elaborado por: @Ligiaviz")+
ggspatial::annotation_scale(location = "br", width_hint = 0.4, line_width = 0.5, height = unit(0.1,"cm"), bar_cols = c("white", "white"))+
ggspatial::annotation_north_arrow(
location = "tr", which_north = "true",
pad_x = unit(0.4, "in"), pad_y = unit(0.4, "in"),
style = ggspatial::north_arrow_nautical(
fill = c("grey40", "white"),
line_col = "grey20",
text_family = "ArcherPro Book"
))
Para exportar o mapa pronto com extensão png, usaremos ggsave.
8.4 Referências sugeridas
Using ggplot to plot pie charts on a geographical map - http://www.spectdata.com/index.php/2018/10/25/how-to-use-ggplot-to-plot-pie-charts-on-a-map/
NEW VERSION OF CARTOGRAPHY (outro pacote do R dedicado à Cartografia Temática) https://rgeomatic.hypotheses.org/category/cartography