
Um guia rápido de mapas no R
Novembro de 2023.
Este guia mostra como elaborar mapas estáticos no R para teses, artigos e notas de política. Mapas interativos, elaborados com bibliotecas como leaflet ou plotly, estão fora de seu escopo.
Mapas em economia exigem os mesmos elementos da cartografia: além do mapa propriamente dito, título, escala, legenda e rosa dos ventos. As variáveis podem ser contínuas ou categóricas, e seus valores determinam se o mapa utiliza uma escala de cores contínua, uma escala divergente ou outro desenho. As escalas de cores devem permanecer legíveis para pessoas com deficiência na visão de cores.
Todas as camadas provêm do BH Map, mantido pela Prefeitura de Belo Horizonte, que detém os direitos autorais; o uso aqui é acadêmico. O site oferece shapefiles de pontos, linhas e polígonos sobre diversos temas. O guia utiliza equipamentos culturais (pontos), linhas de metrô (linhas) e população por bairro em 2010 (polígonos). O limite municipal provém do pacote geobr, que baixa shapefiles de municípios e estados brasileiros diretamente no R.
Pontos
Os mapas utilizam a função geom_sf do ggplot2. A barra de escala e a rosa dos ventos provêm do ggsn.
ggplot() + geom_sf(data = bh) +
geom_sf(data = cultural_facilities, aes()) +
labs(x = "Longitude", y = "Latitude",
title = "Cultural facilities in Belo Horizonte, MG") +
ggsn::scalebar(data = bh,
location = "bottomright",
dist = 2,
dist_unit = "km",
transform = TRUE,
model = "GRS80",
st.size = 2) +
ggsn::north(data = bh,
location = "topleft",
symbol = 12,
scale = 0.15) +
theme_bw()
- Mapa. A função geom_sf desenha as camadas. Camadas de pontos dispensam mapeamento estético. A função labs define o título, os rótulos dos eixos e o título da legenda.
- Barra de escala. A barra de escala do ggsn pode ser reposicionada com location e redimensionada; o argumento dist geralmente precisa de ajuste para mapas em escalas diferentes.
- Rosa dos ventos. O ggsn oferece 14 símbolos; este mapa utiliza o símbolo 12. Sua posição também pode ser alterada.
Linhas
O mapa do metrô segue a mesma estrutura e admite a mesma personalização.
ggplot() + geom_sf(data = bh) +
geom_sf(data = metro, aes()) +
labs(x = "Longitude", y = "Latitude",
title = "Subway lines in Belo Horizonte, MG") +
ggsn::scalebar(data = bh,
location = "bottomright",
dist = 2,
dist_unit = "km",
transform = TRUE,
model = "GRS80",
st.size = 2) +
ggsn::north(data = bh,
location = "topleft",
symbol = 12,
scale = 0.15) +
theme_bw()
Polígonos
A estética fill colore cada polígono segundo o valor de uma variável, aqui o número de moradores por domicílio em cada bairro. A função scale_fill_viridis substitui a escala azul padrão; o RColorBrewer oferece outras paletas.
ggplot() + geom_sf(data = bh) +
geom_sf(data = pop_bh, aes(fill = HAB_DOM)) +
labs(x = "Longitude", y = "Latitude",
title = "Population by neighborhood in Belo Horizonte, MG",
fill = "Residents per household") +
scale_fill_viridis(direction = -1, na.value = "white") +
ggsn::scalebar(data = bh,
location = "bottomright",
dist = 2,
dist_unit = "km",
transform = TRUE,
model = "GRS80",
st.size = 2) +
ggsn::north(data = bh,
location = "topleft",
symbol = 12,
scale = 0.15) +
theme_bw()
Combinação de camadas
As camadas são desenhadas na ordem em que são declaradas. Para que as linhas de metrô apareçam sobre os polígonos dos bairros, a camada metro deve vir depois da camada de população; caso contrário, os polígonos encobrem as linhas.
ggplot() + geom_sf(data = bh) +
geom_sf(data = pop_bh, aes(fill = HAB_DOM)) +
labs(x = "Longitude", y = "Latitude",
title = "Population by neighborhood and subway lines in Belo Horizonte, MG",
fill = "Residents per household") +
scale_fill_viridis(direction = -1, na.value = "white") +
ggsn::scalebar(data = bh,
location = "bottomright",
dist = 2,
dist_unit = "km",
transform = TRUE,
model = "GRS80",
st.size = 2) +
ggsn::north(data = bh,
location = "topleft",
symbol = 12,
scale = 0.15) +
geom_sf(data = metro, aes()) +
theme_bw()
Paletas de cores
Os pacotes viridis e RColorBrewer oferecem muitas paletas. A seguir, o mesmo mapa com duas delas:
Viridis
ggplot() + geom_sf(data = bh) +
geom_sf(data = pop_bh, aes(fill = HAB_DOM)) +
labs(x = "Longitude", y = "Latitude",
title = "Population by neighborhood in Belo Horizonte, MG",
fill = "Residents per household") +
scale_fill_viridis(direction = -1, na.value = "white") +
ggsn::scalebar(data = bh,
location = "bottomright",
dist = 2,
dist_unit = "km",
transform = TRUE,
model = "GRS80",
st.size = 2) +
ggsn::north(data = bh,
location = "topleft",
symbol = 12,
scale = 0.15) +
theme_bw()
RColorBrewer, Spectral
n_colors <- 7
spectral_colors <- brewer.pal(n_colors, "Spectral")
ggplot() + geom_sf(data = bh) +
geom_sf(data = pop_bh, aes(fill = HAB_DOM)) +
labs(x = "Longitude", y = "Latitude",
title = "Population by neighborhood in Belo Horizonte, MG",
fill = "Residents per household") +
scale_fill_gradientn(colours = spectral_colors,
name = "Residents per household") +
ggsn::scalebar(data = bh,
location = "bottomright",
dist = 2,
dist_unit = "km",
transform = TRUE,
model = "GRS80",
st.size = 2) +
ggsn::north(data = bh,
location = "topleft",
symbol = 12,
scale = 0.15) +
theme_bw()