O brazilmaps fornece malhas territoriais simplificadas
como objetos sf. Todos os mapas usados abaixo são
instalados com o pacote: nenhum exemplo depende de conexão com a
internet.
Esta vignette apresenta um fluxo de trabalho completo, desde a escolha da divisão territorial até a construção de mapas temáticos. As geometrias são adequadas para visualização e análise exploratória, mas não para medições cadastrais ou decisões sobre limites legais.
get_brmap() usa nomes em lower snake case. Além
do país, das grandes regiões e das unidades da federação, estão
disponíveis regiões geográficas imediatas e intermediárias, municípios e
duas divisões estatísticas descontinuadas pelo IBGE.
levels <- c(
"country", "region", "state",
"intermediate_region", "immediate_region",
"municipality", "mesoregion", "microregion",
"state_hex", "state_region"
)
data.frame(level = levels)
#> level
#> 1 country
#> 2 region
#> 3 state
#> 4 intermediate_region
#> 5 immediate_region
#> 6 municipality
#> 7 mesoregion
#> 8 microregion
#> 9 state_hex
#> 10 state_regionO resultado padrão é um objeto sf em SIRGAS 2000
(EPSG:4674), pronto para uso com o ecossistema espacial do R.
states <- get_brmap("state")
class(states)
#> [1] "sf" "data.frame"
sf::st_crs(states)$input
#> [1] "EPSG:4674"
names(states)
#> [1] "state_code" "name" "state_abbreviation"
#> [4] "region_code" "geometry"Um mapa simples pode ser criado diretamente:
regions <- get_brmap("region")
plot_brmap(
regions,
fill_by = "name",
border_colour = "white",
border_linewidth = 0.5
) +
scale_fill_brewer(palette = "Set2") +
labs(
title = "Grandes regiões do Brasil",
fill = NULL
)O argumento filters recebe uma lista nomeada de códigos
territoriais. Quando há mais de uma condição, todas são aplicadas
simultaneamente.
pernambuco <- get_brmap(
"municipality",
filters = list(region = 2, state = 26)
)
unique(
sf::st_drop_geometry(pernambuco)[c("region_code", "state_code")]
)
#> region_code state_code
#> 1466 2 26É possível sobrepor diferentes níveis porque todos usam o mesmo sistema de referência:
pe_state <- get_brmap("state", filters = list(state = 26))
ggplot() +
geom_sf(
data = pernambuco,
fill = "#d9ecf2",
colour = "white",
linewidth = 0.12
) +
geom_sf(
data = pe_state,
fill = NA,
colour = "#174a5b",
linewidth = 0.65
) +
labs(title = "Municípios de Pernambuco") +
theme_brmap()Os mesmos filtros podem selecionar outras divisões. Por exemplo, o código de uma região imediata pode ser obtido na DTB e usado para recortar sua malha:
recife_hierarchy <- get_dtb(name = "Recife")
recife_hierarchy[
recife_hierarchy$level == "municipality",
c("municipality_name", "immediate_region_code", "immediate_region_name")
]
#> municipality_name immediate_region_code immediate_region_name
#> 2935 Recife 260001 Recife
recife_immediate <- get_brmap(
"municipality",
filters = list(
immediate_region =
recife_hierarchy$immediate_region_code[
recife_hierarchy$level == "municipality"
][1]
)
)plot_brmap(
recife_immediate,
fill = "#f4c95d",
border_colour = "white",
border_linewidth = 0.25
) +
labs(title = "Região geográfica imediata do Recife")plot_brmap() pode juntar uma tabela ao mapa durante a
plotagem. O vetor nomeado em by informa a coluna do mapa à
esquerda e a coluna dos dados à direita.
data("gini2015")
plot_brmap(
states,
data = gini2015,
by = c("state_code" = "cod"),
fill_by = "gini",
border_colour = "white",
border_linewidth = 0.3
) +
scale_fill_viridis_c(
option = "C",
direction = -1,
na.value = "grey90"
) +
labs(
title = "Índice de Gini por unidade da federação — 2015",
fill = "Gini"
)Para reutilizar os atributos acrescentados em outras operações, faça
a junção explicitamente com join_brmap(). O objeto continua
sendo sf.
data("pop2017")
pe_population <- join_brmap(
get_brmap(
"municipality",
year = 2023,
filters = list(state = 26)
),
pop2017,
by = c("municipality_code" = "mun")
)
inherits(pe_population, "sf")
#> [1] TRUEplot_brmap(
pe_population,
fill_by = "pop2017",
border_colour = "white",
border_linewidth = 0.12
) +
scale_fill_viridis_c(
trans = "log10",
labels = function(x) {
format(
x,
big.mark = ".",
decimal.mark = ",",
scientific = FALSE,
trim = TRUE
)
},
na.value = "grey90"
) +
labs(
title = "População municipal de Pernambuco — 2017",
subtitle = "Escala logarítmica",
fill = "Habitantes"
)get_dtb_levels() relaciona códigos e nomes de diferentes
níveis da Divisão Territorial Brasileira. Aqui, a função é usada para
contar municípios por unidade da federação e levar o resultado de volta
ao mapa.
municipality_state <- get_dtb_levels(c("municipality", "state"))
municipality_count <- aggregate(
municipality_code ~ state_code,
data = municipality_state,
FUN = length
)
names(municipality_count)[2] <- "n_municipalities"
states_with_count <- join_brmap(
states,
municipality_count,
by = "state_code"
)plot_brmap(
states_with_count,
fill_by = "n_municipalities",
border_colour = "white",
border_linewidth = 0.3
) +
scale_fill_viridis_c(option = "B", direction = -1) +
labs(
title = "Número de municípios por unidade da federação",
fill = "Municípios"
)O pacote inclui duas representações alternativas das unidades da
federação. state_hex atribui a mesma área visual a cada
unidade, sendo útil quando estados pequenos precisam ter o mesmo
destaque dos demais. state_region organiza as unidades em
blocos que realçam sua grande região.
state_attributes <- sf::st_drop_geometry(states)[
c("state_code", "state_abbreviation")
]
state_hex <- join_brmap(
get_brmap("state_hex"),
state_attributes,
by = "state_code"
)
state_hex$cartogram <- "Hexagonal"
state_region <- join_brmap(
get_brmap("state_region"),
state_attributes,
by = "state_code"
)
state_region$cartogram <- "Agrupado por região"
state_cartograms <- rbind(state_hex, state_region)
state_cartograms <- join_brmap(
state_cartograms,
gini2015,
by = c("state_code" = "cod")
)
cartogram_labels <- suppressWarnings(
sf::st_point_on_surface(state_cartograms)
)
label_coordinates <- sf::st_coordinates(cartogram_labels)
cartogram_labels$x <- label_coordinates[, "X"]
cartogram_labels$y <- label_coordinates[, "Y"]
cartogram_labels <- sf::st_drop_geometry(cartogram_labels)
ggplot(state_cartograms) +
geom_sf(
aes(fill = gini),
colour = "white",
linewidth = 0.5
) +
geom_text(
data = cartogram_labels,
aes(x = x, y = y, label = state_abbreviation),
colour = "grey15",
fontface = "bold",
size = 2.1
) +
facet_wrap(vars(cartogram), nrow = 1) +
scale_fill_viridis_c(
option = "C",
direction = -1,
na.value = "grey90"
) +
labs(
title = "Índice de Gini em dois cartogramas estaduais",
fill = "Gini"
) +
theme_brmap() +
theme(
strip.text = element_text(face = "bold"),
panel.spacing = grid::unit(0.7, "lines")
)Os dois painéis usam exatamente a mesma variável e a mesma escala de
cores. Para mapas geográficos convencionais, use state.
plot_brmap() devolve um ggplot. Portanto,
escalas, títulos, anotações, facetas e temas podem ser acrescentados
normalmente.
map <- plot_brmap(
get_brmap("state", filters = list(region = 4)),
fill = "#92c5de",
border_colour = "#1f4e5f",
border_linewidth = 0.45
) +
labs(
title = "Região Sul",
subtitle = "Malhas locais e simplificadas do brazilmaps",
caption = "Sistema de referência: SIRGAS 2000"
) +
theme(
plot.title = element_text(face = "bold", size = 14),
plot.caption = element_text(colour = "grey40")
)
mapO objeto pode ser salvo com as funções usuais do
ggplot2:
O ano mais recente é usado por padrão. As edições municipais
instaladas podem ser consultadas com brmap_editions() e
selecionadas pelo argumento year.
brmap_editions()[c("year", "n_features")]
#> year n_features
#> 1 2000 5508
#> 2 2001 5561
#> 3 2007 5564
#> 4 2010 5565
#> 5 2023 5570
#> 6 2025 5571
goias_2000 <- get_brmap(
"municipality",
year = 2000,
filters = list(state = 52)
)Para critérios de seleção das edições, comparações temporais e
limitações da classificação histórica, consulte a vignette
vignette("historical-municipal-meshes", package = "brazilmaps").