--- title: "brazilmaps na prática" author: "Renato Prado Siqueira" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{brazilmaps na prática} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.align = "center", fig.width = 7, fig.height = 4, dpi = 96, dev.args = list(type = "cairo-png") ) old_ctype <- Sys.getlocale("LC_CTYPE") if ( .Platform$OS.type == "windows" && old_ctype %in% c("C", "POSIX") ) { suppressWarnings( try(Sys.setlocale("LC_CTYPE", "Portuguese_Brazil.utf8"), silent = TRUE) ) } ``` ```{r packages} library(brazilmaps) library(ggplot2) ``` 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. ## Escolher o nível territorial `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. ```{r geographic-levels} levels <- c( "country", "region", "state", "intermediate_region", "immediate_region", "municipality", "mesoregion", "microregion", "state_hex", "state_region" ) data.frame(level = levels) ``` O resultado padrão é um objeto `sf` em SIRGAS 2000 (EPSG:4674), pronto para uso com o ecossistema espacial do R. ```{r state-object} states <- get_brmap("state") class(states) sf::st_crs(states)$input names(states) ``` Um mapa simples pode ser criado diretamente: ```{r regions-map} 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 ) ``` ## Recortar a área de interesse O argumento `filters` recebe uma lista nomeada de códigos territoriais. Quando há mais de uma condição, todas são aplicadas simultaneamente. ```{r filters} pernambuco <- get_brmap( "municipality", filters = list(region = 2, state = 26) ) unique( sf::st_drop_geometry(pernambuco)[c("region_code", "state_code")] ) ``` É possível sobrepor diferentes níveis porque todos usam o mesmo sistema de referência: ```{r pernambuco-map, fig.height=3.8} 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: ```{r immediate-filter} recife_hierarchy <- get_dtb(name = "Recife") recife_hierarchy[ recife_hierarchy$level == "municipality", c("municipality_name", "immediate_region_code", "immediate_region_name") ] recife_immediate <- get_brmap( "municipality", filters = list( immediate_region = recife_hierarchy$immediate_region_code[ recife_hierarchy$level == "municipality" ][1] ) ) ``` ```{r immediate-map, fig.height=3.8} plot_brmap( recife_immediate, fill = "#f4c95d", border_colour = "white", border_linewidth = 0.25 ) + labs(title = "Região geográfica imediata do Recife") ``` ## Juntar indicadores e criar mapas temáticos `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. ```{r state-indicator} 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`. ```{r municipality-indicator} 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") ``` ```{r population-map, fig.height=2.8} plot_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" ) ``` ## Produzir um indicador a partir da hierarquia `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. ```{r hierarchy-count} 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" ) ``` ```{r hierarchy-count-map} 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" ) ``` ## Usar cartogramas 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. ```{r cartograms-map, fig.width=8, fig.height=3.8} 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`. ## Personalizar e exportar `plot_brmap()` devolve um `ggplot`. Portanto, escalas, títulos, anotações, facetas e temas podem ser acrescentados normalmente. ```{r customize} 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") ) map ``` O objeto pode ser salvo com as funções usuais do `ggplot2`: ```{r export, eval=FALSE} ggsave( "regiao-sul.png", plot = map, width = 8, height = 6, dpi = 300 ) ``` ## Malhas municipais históricas O ano mais recente é usado por padrão. As edições municipais instaladas podem ser consultadas com `brmap_editions()` e selecionadas pelo argumento `year`. ```{r editions} brmap_editions()[c("year", "n_features")] 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")`. ```{r restore-locale, include=FALSE} if (!identical(Sys.getlocale("LC_CTYPE"), old_ctype)) { suppressWarnings(Sys.setlocale("LC_CTYPE", old_ctype)) } ```