Librerías utilizadas:

if (!require(pacman)) install.packages("pacman")
library(pacman) ; p_load("tidyverse", 
                         "sf",
                         "leaflet",
                         "viridis",
                         "ghibli")

Para este mapa utilizaremos la base Subsidios directos a la población, por municipio de Cuenta Pública del Portal de Transparencia Pública, disponible en:

https://www.transparenciapresupuestaria.gob.mx/work/models/PTP/DatosAbiertos/Entidades_Federativas/Subsidios_CP2023.zip

Esta base cuenta con información del presupuesto ejercido por programa social a nivel municipal.

# Cargamos la base de subsidios y hacemos las modificaciones al formato para crear una variable ID compatible con los archivos geojson

subsidios_cp23<-read.csv("Subsidios_CP23.csv", 
                         fileEncoding = "ISO-8859-1") %>% 
  mutate(ID_ENTIDAD_FEDERATIVA = str_pad(ID_ENTIDAD_FEDERATIVA,
                                         width = 2,
                                         side = "left",
                                         pad = "0")) %>% 
  mutate(ID_MUNICIPIO = str_pad(ID_MUNICIPIO,
                                         width = 3,
                                         side = "left",
                                         pad = "0")) %>% 
  mutate(idgeo = str_c(ID_ENTIDAD_FEDERATIVA,ID_MUNICIPIO)) %>% 
  mutate(mod = substr(MODALIDAD_PP,1,1))

sub_cp23 <- aggregate(subsidios_cp23$MONTO_EJERCIDO,
                      list(subsidios_cp23$idgeo), sum)

# A continuación cargamos la información de polígono de estados y municipios: 

# Polígono de estados
shp_ent <- st_read("https://raw.githubusercontent.com/JuveCampos/Shapes_Resiliencia_CDMX_CIDE/master/geojsons/Division%20Politica/DivisionEstatal.geojson")

# Polígono de municipios
shp <- st_read("municipios_2022.geojson")  %>% 
  mutate(CVEGEO = str_pad(CVEGEO, 
                          width = 5, 
                          side = "left", 
                          pad = "0"))

# Por último, unimos los datos de presupuesto y los polígonos de municipios
map_subsidios <- left_join(shp,
                           sub_cp23, 
                           by = c("CVEGEO" = "Group.1")) %>%
  mutate(x = x/1e6)

quantile(map_subsidios$x,c(0.20, 0.40, 0.60, 0.80, 1), na.rm=T)

Con la base resultante podemos elaborar un mapa del presupuesto ejercido por programa social a nivel municipal

etq_mpios <- str_c(map_subsidios$CVEGEO, " - ",
                   map_subsidios$NOMGEO)

# El popup se construye como una cadena de texto con formato html
popup_mapa <- str_c("<b>Municipio: </b>",map_subsidios$NOMGEO,
                    "<br>",
                    "<b>Presupuesto de desarrollo<br>social ejercido:</b>",
                    "<br>",
                    "$", format(map_subsidios$x, 
                                digits= 2, scientific= F, big.mark = ","), 
                    " Millones de Pesos")


# La paleta de colores se construye con dos argumentos: vector de colores y vector de dominio o valores a los que se asigna un color
paleta_presupuesto <- colorNumeric(palette = viridis(10, 
                                                     direction= 1, 
                                                     option = "A"), 
                                   domain = map_subsidios$x)

mapa_presupuesto <- leaflet() %>% 
  addProviderTiles(providers$CartoDB.Positron) %>% 
  addPolygons(data = map_subsidios, 
              weight = 0.8, 
              color = "black", 
              fillColor = paleta_presupuesto(map_subsidios$x),
                # map_subsidios$nivel_pres), 
              opacity = 1, 
              label = etq_mpios,
              popup = popup_mapa,
              fillOpacity = 0.7, 
              highlightOptions =
                highlightOptions(color = "green",
                                 weight = 5, 
                                 bringToFront = F,
                                 opacity = 1)) %>% 
  addPolygons(data = shp_ent, 
              fill = NA, 
              opacity = 1,
              color = "white", 
              weight = 2) %>% 
  addLegend(position = "bottomleft", 
            pal = paleta_presupuesto, 
            values = map_subsidios$x, 
            title = "<center>Presupuesto de desarrollo<br>social ejercido<br>(millones de pesos)</center>")

mapa_presupuesto
htmlwidgets::saveWidget(mapa_presupuesto, "mapa_presupuesto.html")
LS0tCnRpdGxlOiAiUHJlc3VwdWVzdG8gZGUgZGVzYXJyb2xsbyBzb2NpYWwgZWplcmNpZG8gcG9yIG11bmljaXBpbyIKYXV0aG9yOiAiTWFydmluIEl2YW4gVHJlam8gTWVuZGV6IgpkYXRlOiAiMjAyNC0wNy0yOSIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGpvdXJuYWwKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIG1haW5mb250OiBCaWVyc3RhZHQKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKZWRpdG9yX29wdGlvbnM6IAogIG1hcmtkb3duOiAKICAgIHdyYXA6IDcyCi0tLQpMaWJyZXLDrWFzIHV0aWxpemFkYXM6CgpgYGB7ciwgZWNobyA9IFRSVUUsIHJlc3VsdHM9J2hpZGUnLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmlmICghcmVxdWlyZShwYWNtYW4pKSBpbnN0YWxsLnBhY2thZ2VzKCJwYWNtYW4iKQpsaWJyYXJ5KHBhY21hbikgOyBwX2xvYWQoInRpZHl2ZXJzZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgInNmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJsZWFmbGV0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICJ2aXJpZGlzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJnaGlibGkiKQpgYGAKUGFyYSBlc3RlIG1hcGEgdXRpbGl6YXJlbW9zIGxhIGJhc2UgWyoqU3Vic2lkaW9zIGRpcmVjdG9zIGEgbGEgcG9ibGFjacOzbiwgcG9yIG11bmljaXBpbyBkZSBDdWVudGEgUMO6YmxpY2EqKl17LnVuZGVybGluZX0gZGVsIFBvcnRhbCBkZSBUcmFuc3BhcmVuY2lhIFDDumJsaWNhLCBkaXNwb25pYmxlIGVuOgoKPGh0dHBzOi8vd3d3LnRyYW5zcGFyZW5jaWFwcmVzdXB1ZXN0YXJpYS5nb2IubXgvd29yay9tb2RlbHMvUFRQL0RhdG9zQWJpZXJ0b3MvRW50aWRhZGVzX0ZlZGVyYXRpdmFzL1N1YnNpZGlvc19DUDIwMjMuemlwPgoKRXN0YSBiYXNlIGN1ZW50YSBjb24gaW5mb3JtYWNpw7NuIGRlbCBwcmVzdXB1ZXN0byBlamVyY2lkbyBwb3IgcHJvZ3JhbWEgc29jaWFsIGEgbml2ZWwgbXVuaWNpcGFsLgoKYGBge3IsIGVjaG8gPSBUUlVFLCByZXN1bHRzPSdoaWRlJyx3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIENhcmdhbW9zIGxhIGJhc2UgZGUgc3Vic2lkaW9zIHkgaGFjZW1vcyBsYXMgbW9kaWZpY2FjaW9uZXMgYWwgZm9ybWF0byBwYXJhIGNyZWFyIHVuYSB2YXJpYWJsZSBJRCBjb21wYXRpYmxlIGNvbiBsb3MgYXJjaGl2b3MgZ2VvanNvbgoKc3Vic2lkaW9zX2NwMjM8LXJlYWQuY3N2KCJTdWJzaWRpb3NfQ1AyMy5jc3YiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVFbmNvZGluZyA9ICJJU08tODg1OS0xIikgJT4lIAogIG11dGF0ZShJRF9FTlRJREFEX0ZFREVSQVRJVkEgPSBzdHJfcGFkKElEX0VOVElEQURfRkVERVJBVElWQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZSA9ICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWQgPSAiMCIpKSAlPiUgCiAgbXV0YXRlKElEX01VTklDSVBJTyA9IHN0cl9wYWQoSURfTVVOSUNJUElPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlID0gImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9ICIwIikpICU+JSAKICBtdXRhdGUoaWRnZW8gPSBzdHJfYyhJRF9FTlRJREFEX0ZFREVSQVRJVkEsSURfTVVOSUNJUElPKSkgJT4lIAogIG11dGF0ZShtb2QgPSBzdWJzdHIoTU9EQUxJREFEX1BQLDEsMSkpCgpzdWJfY3AyMyA8LSBhZ2dyZWdhdGUoc3Vic2lkaW9zX2NwMjMkTU9OVE9fRUpFUkNJRE8sCiAgICAgICAgICAgICAgICAgICAgICBsaXN0KHN1YnNpZGlvc19jcDIzJGlkZ2VvKSwgc3VtKQoKIyBBIGNvbnRpbnVhY2nDs24gY2FyZ2Ftb3MgbGEgaW5mb3JtYWNpw7NuIGRlIHBvbMOtZ29ubyBkZSBlc3RhZG9zIHkgbXVuaWNpcGlvczogCgojIFBvbMOtZ29ubyBkZSBlc3RhZG9zCnNocF9lbnQgPC0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0p1dmVDYW1wb3MvU2hhcGVzX1Jlc2lsaWVuY2lhX0NETVhfQ0lERS9tYXN0ZXIvZ2VvanNvbnMvRGl2aXNpb24lMjBQb2xpdGljYS9EaXZpc2lvbkVzdGF0YWwuZ2VvanNvbiIpCgojIFBvbMOtZ29ubyBkZSBtdW5pY2lwaW9zCnNocCA8LSBzdF9yZWFkKCJtdW5pY2lwaW9zXzIwMjIuZ2VvanNvbiIpICAlPiUgCiAgbXV0YXRlKENWRUdFTyA9IHN0cl9wYWQoQ1ZFR0VPLCAKICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpZGUgPSAibGVmdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHBhZCA9ICIwIikpCgojIFBvciDDumx0aW1vLCB1bmltb3MgbG9zIGRhdG9zIGRlIHByZXN1cHVlc3RvIHkgbG9zIHBvbMOtZ29ub3MgZGUgbXVuaWNpcGlvcwptYXBfc3Vic2lkaW9zIDwtIGxlZnRfam9pbihzaHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9jcDIzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJDVkVHRU8iID0gIkdyb3VwLjEiKSkgJT4lCiAgbXV0YXRlKHggPSB4LzFlNikKCnF1YW50aWxlKG1hcF9zdWJzaWRpb3MkeCxjKDAuMjAsIDAuNDAsIDAuNjAsIDAuODAsIDEpLCBuYS5ybT1UKQpgYGAKCkNvbiBsYSBiYXNlIHJlc3VsdGFudGUgcG9kZW1vcyBlbGFib3JhciB1biBtYXBhIGRlbCBwcmVzdXB1ZXN0byBlamVyY2lkbyBwb3IgcHJvZ3JhbWEgc29jaWFsIGEgbml2ZWwgbXVuaWNpcGFsCgpgYGB7cn0KZXRxX21waW9zIDwtIHN0cl9jKG1hcF9zdWJzaWRpb3MkQ1ZFR0VPLCAiIC0gIiwKICAgICAgICAgICAgICAgICAgIG1hcF9zdWJzaWRpb3MkTk9NR0VPKQoKIyBFbCBwb3B1cCBzZSBjb25zdHJ1eWUgY29tbyB1bmEgY2FkZW5hIGRlIHRleHRvIGNvbiBmb3JtYXRvIGh0bWwKcG9wdXBfbWFwYSA8LSBzdHJfYygiPGI+TXVuaWNpcGlvOiA8L2I+IixtYXBfc3Vic2lkaW9zJE5PTUdFTywKICAgICAgICAgICAgICAgICAgICAiPGJyPiIsCiAgICAgICAgICAgICAgICAgICAgIjxiPlByZXN1cHVlc3RvIGRlIGRlc2Fycm9sbG88YnI+c29jaWFsIGVqZXJjaWRvOjwvYj4iLAogICAgICAgICAgICAgICAgICAgICI8YnI+IiwKICAgICAgICAgICAgICAgICAgICAiJCIsIGZvcm1hdChtYXBfc3Vic2lkaW9zJHgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cz0gMiwgc2NpZW50aWZpYz0gRiwgYmlnLm1hcmsgPSAiLCIpLCAKICAgICAgICAgICAgICAgICAgICAiIE1pbGxvbmVzIGRlIFBlc29zIikKCgojIExhIHBhbGV0YSBkZSBjb2xvcmVzIHNlIGNvbnN0cnV5ZSBjb24gZG9zIGFyZ3VtZW50b3M6IHZlY3RvciBkZSBjb2xvcmVzIHkgdmVjdG9yIGRlIGRvbWluaW8gbyB2YWxvcmVzIGEgbG9zIHF1ZSBzZSBhc2lnbmEgdW4gY29sb3IKcGFsZXRhX3ByZXN1cHVlc3RvIDwtIGNvbG9yTnVtZXJpYyhwYWxldHRlID0gdmlyaWRpcygxMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAiQSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4gPSBtYXBfc3Vic2lkaW9zJHgpCgptYXBhX3ByZXN1cHVlc3RvIDwtIGxlYWZsZXQoKSAlPiUgCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkQ2FydG9EQi5Qb3NpdHJvbikgJT4lIAogIGFkZFBvbHlnb25zKGRhdGEgPSBtYXBfc3Vic2lkaW9zLCAKICAgICAgICAgICAgICB3ZWlnaHQgPSAwLjgsIAogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gcGFsZXRhX3ByZXN1cHVlc3RvKG1hcF9zdWJzaWRpb3MkeCksCiAgICAgICAgICAgICAgICAjIG1hcF9zdWJzaWRpb3Mkbml2ZWxfcHJlcyksIAogICAgICAgICAgICAgIG9wYWNpdHkgPSAxLCAKICAgICAgICAgICAgICBsYWJlbCA9IGV0cV9tcGlvcywKICAgICAgICAgICAgICBwb3B1cCA9IHBvcHVwX21hcGEsCiAgICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjcsIAogICAgICAgICAgICAgIGhpZ2hsaWdodE9wdGlvbnMgPQogICAgICAgICAgICAgICAgaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJncmVlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodCA9IDUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ID0gMSkpICU+JSAKICBhZGRQb2x5Z29ucyhkYXRhID0gc2hwX2VudCwgCiAgICAgICAgICAgICAgZmlsbCA9IE5BLCAKICAgICAgICAgICAgICBvcGFjaXR5ID0gMSwKICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsIAogICAgICAgICAgICAgIHdlaWdodCA9IDIpICU+JSAKICBhZGRMZWdlbmQocG9zaXRpb24gPSAiYm90dG9tbGVmdCIsIAogICAgICAgICAgICBwYWwgPSBwYWxldGFfcHJlc3VwdWVzdG8sIAogICAgICAgICAgICB2YWx1ZXMgPSBtYXBfc3Vic2lkaW9zJHgsIAogICAgICAgICAgICB0aXRsZSA9ICI8Y2VudGVyPlByZXN1cHVlc3RvIGRlIGRlc2Fycm9sbG88YnI+c29jaWFsIGVqZXJjaWRvPGJyPihtaWxsb25lcyBkZSBwZXNvcyk8L2NlbnRlcj4iKQoKbWFwYV9wcmVzdXB1ZXN0bwoKaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQobWFwYV9wcmVzdXB1ZXN0bywgIm1hcGFfcHJlc3VwdWVzdG8uaHRtbCIpCmBgYA==