Automação de gráficos com mapas no Rmarkdown

Olá! Estou criando um rmarkdown em que vou gerar gráficos dos 27 Estados brasileiros que apontem em quais municípios possuem determinada matrícula. Para isso estou usando os pacotes sf e geobr. Inicialmente, consigo criar o gráfico usando o filter por estado nesse código:

library(tidyverse)
library(sf)
library(geobr)

ggplot() +
  geom_sf(data = mapas %>%
            filter(abbrev_state == "CE"))  +
  geom_sf(data = mapas_int %>%
            filter(name_state == "Ceará") %>%
            group_by(code_muni) %>%
            summarise(QT_MAT_MED_INT = sum(QT_MAT_MED_INT)), aes(fill = QT_MAT_MED_INT)) +
  scale_fill_gradientn(colours = c("light green", "green", "yellow")) +
  theme_minimal()

em que o objeto “mapas” tem todos os municípios e o objeto “mapas_int” tem apenas aqueles que possuem matrículas que quero destacar, por isso uso os dois sobrepostos no ggplot.

o que gostaria de fazer é um looping que gere o gráfico dos 27 estados sem precisar trocar o parâmetro do filter. Pesquisando no fórum encontrei esse tópico e tentei adaptar o código conforme abaixo, mas ele só me retorna o mapa do Brasil 27 vezes, e não de cada estado.

todos_os_estados <- unique(mapas_int$code_state) 
   
for (estado in todos_os_estados) {
       
      cat("<br>", "<h2>", estado, "</h2>") 
      
     grafico <- mapas_int %>% 
      filter(mapas_int$name_state == estado) %>% 
      ggplot() +
      geom_sf(data = mapas) +
      geom_sf(data = mapas_int %>%
                group_by(code_muni) %>%
                summarise(QT_MAT_MED_INT = sum(QT_MAT_MED_INT)), aes(fill = QT_MAT_MED_INT)) +
      scale_fill_gradientn(colours = c("light green", "green", "yellow")) +
      theme_minimal()
      
      print(grafico)
      
      cat("<br>")
    }

Alguém tem ideia de onde está o problema?
Obrigado!

Eu suspeito que possa ser na base de dados, mas não tenho ctz. Eu fiz um exemplo simples aqui, usando o mesmo comando. Veja se ajuda…

Obs.: Sugiro que faça a base de dados com o geom em um script separado e salve em read_rds, pra ver se fica mais leve quando usar no rmarkdown.


title: “UFs”
author: “Gerrio”
date: “25/02/2022”
output: html_document

knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning=FALSE)
library(dplyr)
library(ggplot2)
library(sf)
# aqui vc cria um vetor com tudo que quer repetir. no seu caso, mude pra UF

# Criar data frame UFs

df = geobr::read_state() |> dplyr::select(name_state, geom) |> 
  dplyr::filter(name_state %in% c('Ceará', 'Paraíba', 'Sergipe'))

df = tidyr::expand_grid(df, indicador = rnorm(5)) |> 
  dplyr::relocate(name_state, indicador, geom) |> sf::st_as_sf()


todas_UFs <- unique(df$name_state) 

# aqui vamos criar o código que vai repetir tudo
for (i in todas_UFs) {
  
  
  cat("<br> <h2> ", i, "</h2>") # cria o titulo
  
  # cria o grafico
  grafico <- df %>% 
    #tidyr::drop_na(name_state, x, geom) %>% 
    filter(name_state == 'Ceará') %>% 
    ggplot(aes(fill = indicador)) +
    geom_sf()+
    labs(title = i)
  
  #  printa o gráfico
  print(grafico)
  
  # pula a linha
  cat("<br>")
}