
Visualización en mapas con censosbo
Source:vignettes/articles/visualizacion-mapas.Rmd
visualizacion-mapas.Rmdcensosbo incluye dos funciones para crear mapas
coropléticos de Bolivia directamente desde R:
| Función | Nivel | Geometrías incluidas |
|---|---|---|
mapa_dep() |
9 departamentos | Sí — geo_departamentos
|
mapa_mun() |
343 municipios | Sí — geo_municipios
|
Ambas devuelven un objeto ggplot que se
puede personalizar con capas y temas adicionales.
Datos geográficos incluidos en el paquete
El paquete incluye dos objetos sf listos para usar sin
necesidad de descargar nada:
# 9 departamentos (objeto sf)
head(geo_departamentos, 3)
#> Simple feature collection with 3 features and 2 fields
#> Geometry type: MULTIPOLYGON
#> Dimension: XY
#> Bounding box: xmin: -69.64423 ymin: -21.51732 xmax: -62.17937 ymax: -11.84968
#> Geodetic CRS: WGS 84
#> idep nombre_dep geometry
#> 1 01 Chuquisaca MULTIPOLYGON (((-65.39291 -...
#> 2 02 La Paz MULTIPOLYGON (((-68.77164 -...
#> 3 03 Cochabamba MULTIPOLYGON (((-64.82723 -...
# Los 343 municipios del CPV-2024 (objeto sf)
head(sf::st_drop_geometry(geo_municipios), 3)
#> idep nombre_dep iprov nombre_prov imun nombre_mun capital superficie_km2
#> 1 01 Chuquisaca 01 Oropeza 01 Sucre Sucre 1671.1
#> 2 01 Chuquisaca 01 Oropeza 02 Yotala Yotala 432.2
#> 3 01 Chuquisaca 01 Oropeza 03 Poroma Poroma 1424.6La tabla geo_bolivia (sin geometrías) tiene los mismos
343 municipios con sus nombres y códigos oficiales, y es más ligera
cuando no hace falta dibujar:
head(geo_bolivia)
#> idep nombre_dep iprov nombre_prov imun nombre_mun
#> 1 01 Chuquisaca 01 Oropeza 01 Sucre
#> 2 01 Chuquisaca 01 Oropeza 02 Yotala
#> 3 01 Chuquisaca 01 Oropeza 03 Poroma
#> 4 01 Chuquisaca 02 Azurduy 01 Azurduy
#> 5 01 Chuquisaca 02 Azurduy 02 Tarvita
#> 6 01 Chuquisaca 03 Zudáñez 01 Zudáñezgeo_municipios trae además la capital y la
superficie_km2 de cada municipio, así que las densidades
salen sin recalcular áreas:
library(dplyr)
sf::st_drop_geometry(geo_municipios) |>
slice_max(superficie_km2, n = 5) |>
select(nombre_mun, nombre_dep, capital, superficie_km2)
#> nombre_mun nombre_dep capital
#> 1 Charagua (Autonomía Guaraní Charagua Iyambae) Santa Cruz Charagua
#> 2 San Ignacio Santa Cruz San Ignacio
#> 3 Ixiamas La Paz Ixiamas
#> 4 Concepción Santa Cruz Concepción
#> 5 San Matías Santa Cruz San Matías
#> superficie_km2
#> 1 70558.7
#> 2 49066.3
#> 3 36968.2
#> 4 28943.0
#> 5 26918.9Procedencia de las geometrías
geo_municipios cruza varias fuentes, porque ninguna
tiene a la vez la geometría de las 343 unidades y la codificación que
usan los microdatos:
- Límites, capital y superficie — SDSN Bolivia, capa del Atlas Municipal de los ODS, la única pública que cubre las 343 unidades del CPV-2024 (los 339 municipios más los cuatro GAIOC creados entre 2016 y 2023).
-
Códigos
idep/iprov/imuny nombres — INE Bolivia (Redatam, CPV-2024), para que coincidan exactamente con los deget_personas_2024()y compañía. -
Emparejamiento entre ambos — los puntos de
comunidades del CPV-2024 (
get_geo_comunidades()), que llevan el código del INE y sirven de árbitro para asignarle a cada polígono el suyo.
geo_departamentos se deriva de
geo_municipios, de modo que los bordes departamentales caen
exactamente sobre los municipales.
SDSN Bolivia (2025). Límites Municipales Bolivia 2025 [Archivo shapefile]. https://sdsnbolivia.org/datos-espaciales/
mapa_dep() — nivel departamental
mapa_dep() recibe un data.frame con la columna
idep y la variable a visualizar. Las geometrías de los 9
departamentos están incluidas en el paquete.
Número de municipios por departamento
n_mun <- geo_bolivia |>
count(idep, name = "n_municipios")
mapa_dep(
n_mun,
"n_municipios",
titulo = "Municipios por departamento — Bolivia",
etiqueta_fill = "Municipios",
mostrar_nombres = TRUE
)
La Paz (87 municipios) y Santa Cruz (56) concentran el 42 % de los municipios del país, reflejo de su extensión territorial y densidad histórica de asentamientos.
Porcentaje de población urbana por departamento (CPV-2024)
urbano_dep <- get_personas_2024(as = "tibble") |>
group_by(idep) |>
summarise(pct_urbano = mean(area == 1, na.rm = TRUE) * 100, .groups = "drop")
mapa_dep(
urbano_dep,
"pct_urbano",
titulo = "Porcentaje de población urbana por departamento (CPV-2024)",
etiqueta_fill = "% urbano"
)Evolución del alfabetismo 1992–2024
# Cambio en tasa de alfabetismo entre el censo 1992 y el CPV-2024
alfa_92 <- get_temporal(variables = "sabe_leer", anios = 1992) |>
group_by(departamento) |>
summarise(alfa_1992 = mean(sabe_leer == 1, na.rm = TRUE) * 100)
alfa_24 <- get_temporal(variables = "sabe_leer", anios = 2024) |>
group_by(departamento) |>
summarise(alfa_2024 = mean(sabe_leer == 1, na.rm = TRUE) * 100)
cambio <- inner_join(alfa_92, alfa_24, by = "departamento") |>
mutate(
idep = sprintf("%02d", as.integer(departamento)),
cambio = alfa_2024 - alfa_1992
)
mapa_dep(cambio, "cambio",
titulo = "Cambio en tasa de alfabetismo 1992–2024 (puntos porcentuales)",
etiqueta_fill = "Cambio (pp)",
paleta = "RdYlGn")
mapa_mun() — nivel municipal
mapa_mun() requiere las columnas idep,
iprov, imun y la variable a visualizar. El
argumento departamento limita el mapa a un
departamento.
Edad promedio por municipio — Beni (CPV-2024)
El departamento del Beni tiene datos pequeños (~12 MB). Con pocas líneas obtenemos un mapa municipal real con datos del CPV-2024:
# Descargar personas del Beni (~12 MB, se guarda en caché)
personas_beni <- get_personas_2024(
departamento = "Beni",
variables = c("p26_edad")
) |>
group_by(idep, iprov, imun) |>
summarise(edad_prom = mean(p26_edad, na.rm = TRUE), .groups = "drop") |>
collect()
#> ✔ Usando caché: persona_dep08.parquet
mapa_mun(
personas_beni,
"edad_prom",
departamento = "Beni",
titulo = "Edad promedio por municipio — Beni (CPV-2024)",
etiqueta_fill = "Edad media",
mostrar_nombres = TRUE
)
Los municipios más jóvenes del Beni (San Borja, 25,8 años; Exaltación, Loreto y San Ignacio, 26) contrastan con Baures y Huacaraje, por encima de 30.
El municipio más joven del departamento es el TIOC-Territorio Indígena Multiétnico, con 24,5 años. Es uno de los cuatro GAIOC creados desde 2016 que faltaban en la cartografía anterior del paquete y que desde la versión 1.6.0 ya se dibujan.
Acceso al agua por cañería — Santa Cruz
agua_sc <- get_viviendas_2024(departamento = "Santa Cruz", as = "tibble") |>
group_by(idep, iprov, imun) |>
summarise(
pct_agua = mean(v07_aguapro == 1, na.rm = TRUE) * 100,
.groups = "drop"
)
mapa_mun(
agua_sc,
"pct_agua",
departamento = "Santa Cruz",
titulo = "Viviendas con agua por cañería — Santa Cruz (CPV-2024)",
etiqueta_fill = "% con agua",
mostrar_nombres = TRUE
)Tasa de alfabetismo — Oruro
# `p40_lee` se preguntó a las personas de 5 años o más, pero las tasas oficiales
# de alfabetismo se publican sobre 15 años o más. Se pide `p26_edad` para poder
# aplicar ese umbral y que el mapa sea comparable con las cifras del INE.
alfa_oruro <- get_personas_2024(
departamento = "Oruro",
variables = c("p40_lee", "p26_edad"),
as = "tibble"
) |>
filter(p26_edad >= 15) |>
group_by(idep, iprov, imun) |>
summarise(
alfa = mean(p40_lee == 1, na.rm = TRUE) * 100,
.groups = "drop"
)
mapa_mun(
alfa_oruro,
"alfa",
departamento = "Oruro",
titulo = "Tasa de alfabetismo (15+ años) por municipio — Oruro (CPV-2024)",
etiqueta_fill = "% sabe leer"
)Personalización
Las funciones devuelven un objeto ggplot
estándar que se puede modificar con cualquier capa de
ggplot2:
n_mun <- geo_bolivia |>
count(idep, name = "n_municipios")
mapa_dep(
n_mun,
"n_municipios",
paleta = "YlOrRd",
etiqueta_fill = "Municipios"
) +
labs(
title = "Organización político-administrativa de Bolivia",
subtitle = "Número de municipios por departamento (CPV-2024)",
caption = "Fuente: INE Bolivia, CPV-2024"
) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5, size = 10, color = "grey40"),
plot.caption = element_text(hjust = 0, size = 8, color = "grey60")
)
Paletas recomendadas
Las funciones detectan automáticamente si la variable es continua o
categórica y aplican la escala correspondiente. Se puede sobrescribir
con paleta:
| Tipo de variable | Paleta recomendada | Argumento |
|---|---|---|
| Continua, ascendente | Blues, YlOrRd, Oranges | paleta = "Blues" |
| Continua, divergente | RdYlGn, PuOr, RdBu | paleta = "RdYlGn" |
| Categórica (≤ 8 cat.) | Set2, Set3, Pastel1 | paleta = "Set2" |
El siguiente ejemplo usa una paleta divergente con una variable derivada de datos reales: la diferencia entre el número de municipios de cada departamento y el promedio nacional.
n_mun_dif <- geo_bolivia |>
count(idep, name = "n_municipios") |>
mutate(diferencia = n_municipios - mean(n_municipios))
mapa_dep(
n_mun_dif,
"diferencia",
paleta = "RdYlGn",
titulo = "Municipios respecto al promedio nacional (CPV-2024)",
etiqueta_fill = "Diferencia"
)
Flujo completo: agregar → mapear
El patrón habitual es: descargar datos → agregar por unidad geográfica → visualizar en mapa:
# Porcentaje de personas con educación superior por municipio — Potosí
get_personas_2024(
departamento = "Potosí",
variables = c("nivel_edu")
) |>
filter(!is.na(nivel_edu)) |>
count(idep, iprov, imun, nivel_edu) |>
collect() |>
group_by(idep, iprov, imun) |>
mutate(pct = n / sum(n) * 100) |>
filter(nivel_edu == 4) |>
mapa_mun(
datos = _,
variable = "pct",
departamento = "Potosí",
titulo = "% con educación superior — Potosí (CPV-2024)"
)