El análisis geográfico en R se ha consolidado como una estrategia
robusta para integrar información espacial con datos administrativos,
demográficos y epidemiológicos dentro de un mismo flujo analítico
reproducible. Su ecosistema —basado en paquetes como sf,
terra, mapview y ggplot2— permite
manipular geometrías, construir visualizaciones temáticas, desarrollar
mapas interactivos y vincular directamente estos insumos con modelos
estadísticos y técnicas de inferencia espacial.
Desde la perspectiva bioestadística, trabajar en R facilita una trazabilidad completa del proceso: cada transformación, unión espacial, clasificación de valores o ajuste visual queda registrado en código, lo que asegura replicación exacta, auditorías metodológicas y versiones comparables del análisis a lo largo del tiempo. Además, la integración con métodos como autocorrelación espacial, modelos CAR/BYM, suavizamientos empíricos o regresiones geográficamente ponderadas hace que el componente cartográfico no sea un resultado aislado, sino una extensión natural del análisis cuantitativo.
Para ilustrar el flujo, se emplean datos simples a nivel departamental (como número de prestadores habilitados o densidad poblacional), aunque el enfoque es completamente generalizable a cualquier métrica territorial: tasas de eventos, indicadores de acceso, perfiles epidemiológicos, carga de enfermedad, determinantes sociales o métricas operativas del sistema de salud.
El desarrollo propuesto es más simple que otros métodos cartográficos avanzados, pero resulta pragmático, reproducible y adecuado para fines analíticos. Se estructura en tres componentes clave:
generación de mapas interactivos mediante mapview,
comparación visual de variables mediante mapas sincronizados (leafsync),
y
creación de un mapa estático en calidad de publicación con ggplot2.
Además, se incorpora un recurso técnico basado en la arquitectura
interna de leaflet
para añadir un minimapa navegacional, útil en análisis nacionales o
territorios amplios donde el contexto espacial mejora la
interpretación.
Aunque herramientas SIG como QGIS y ArcGIS Pro ofrecen capacidades más avanzadas en edición espacial, modelación geográfica y composición cartográfica, el enfoque en R aporta mayor eficiencia analítica, automatización, reproducibilidad y articulación con procesos estadísticos complejos, lo que lo convierte en una alternativa estratégica en investigación, salud pública, economía de la salud y evaluación territorial.
La preparación del entorno analítico asegura consistencia, reproducibilidad y control sobre todo el flujo geoespacial. En esta etapa se cargan las librerías fundamentales, se establecen parámetros comunes para estandarizar la ejecución y se definen las fuentes de datos espaciales y administrativas que servirán como base del análisis.
Se utilizan librerías del ecosistema geoespacial de R que permiten manipular objetos espaciales, generar mapas interactivos, sincronizar vistas y producir visualizaciones estáticas de calidad.
# Carga de librerías principales
library(sf) # Manipulación de objetos espaciales en formato simple features
library(dplyr) # Transformación y manejo de datos
library(mapview) # Mapas interactivos basados en leaflet
library(leafsync) # Sincronización de múltiples mapas interactivos
library(classInt) # Cálculo de cortes (Jenks, cuantiles, etc.)
library(RColorBrewer) # Paletas de colores
library(rnaturalearth) # Descarga de geometrías oficiales
library(stringi) # Normalización de nombres
library(leaflet) # Funciones adicionales para interacción (minimapa)
library(ggplot2) # Mapas estáticos de alta calidad
library(scales) # Formatos numéricos (separadores de miles)
library(httr) # Descargar el archivo desde GitHub
library(readxl) # Leer el Excel descargado desde GitHub
library(htmlwidgets) # Guardar e incrustar mapas interactivos en archivos HTML
El análisis utiliza geometrías oficiales provenientes de Natural Earth,
una fuente estandarizada para divisiones político-administrativas, y un
conjunto de datos administrativos suministrado por el usuario para
ilustrar el flujo.
# Descarga de divisiones administrativas de nivel 1 (departamentos)
col_dept <- ne_states(country = "colombia", returnclass = "sf") |>
dplyr::select(name, geometry)
# Eliminar polígonos sin nombre (islotes no administrativos que vienen en Natural Earth)
col_dept <- col_dept |>
dplyr::filter(!is.na(name))
Estas geometrías se encuentran en formato simple features
(sf), lo que permite manipulación eficiente, operaciones
espaciales y mezcla con datos tabulares.
url_ips <- "https://raw.githubusercontent.com/CamiloGz87/Making-maps-with-R/main/datos/analisis_geografico_IPS.xlsx"
tmp <- tempfile(fileext = ".xlsx")
GET(url_ips, write_disk(tmp, overwrite = TRUE))
## Response [https://raw.githubusercontent.com/CamiloGz87/Making-maps-with-R/main/datos/analisis_geografico_IPS.xlsx]
## Date: 2025-11-20 01:34
## Status: 200
## Content-Type: application/octet-stream
## Size: 15.2 kB
## <ON DISK> C:\Users\Usuario\AppData\Local\Temp\RtmpueSi6u\file51c26f86c60.xlsx
analisis_geografico_IPS <- read_excel(tmp)
El conjunto de datos analisis_geografico_IPS combina
información demográfica y operativa del sistema de salud, asociada al
nivel departamental en Colombia, proveniente de dos fuentes
oficiales:
Población y densidad poblacional: datos derivados del Censo Nacional de Población y Vivienda 2018 del DANE.
Prestadores habilitados: número total de prestadores registrados en el Registro Especial de Prestadores de Servicios de Salud – REPS, administrado por el Ministerio de Salud y Protección Social.
La consolidación se realiza mediante el nombre del departamento, lo cual permite su vinculación directa con las geometrías espaciales y facilita la construcción de mapas temáticos reproducibles en R.
Nota para el usuario: esta base cumple un propósito demostrativo dentro del flujo analítico. Puede reemplazarse por cualquier conjunto de datos departamentales o municipales —indicadores epidemiológicos, registros administrativos, encuestas, tasas o métricas operativas— siempre que incluya un identificador territorial compatible. El código está estructurado para adaptarse a estos escenarios con mínimas modificaciones.
El preprocesamiento garantiza la compatibilidad entre las geometrías oficiales y las variables administrativas, asegurando que ambos conjuntos puedan integrarse sin inconsistencias. En esta etapa se normalizan los nombres, se inspecciona la estructura espacial, se ejecuta la unión y se valida la integridad del objeto resultante.
Para evitar inconsistencias entre fuentes (tildes, diferencias de
capitalización, espacios o codificación UTF-8), se genera una clave
estandarizada (depto_norm) que facilita un emparejamiento
seguro entre el shapefile de departamentos y la base administrativa.
# Función de normalización
normalizar <- function(x) {
x |>
trimws() |>
toupper() |>
stri_trans_general("Latin-ASCII")
}
# Normalización en geometrías
col_dept <- col_dept |>
mutate(depto_norm = normalizar(name))
# Normalización en datos administrativos
analisis_geografico_IPS <- analisis_geografico_IPS |>
mutate(depto_norm = normalizar(Nombre_Departamento))
sfLas geometrías provenientes de Natural Earth se
encuentran en formato Simple Features (sf), que
combina atributos tabulares con información geométrica estandarizada.
Este formato facilita la integración con el tidyverse,
operaciones espaciales y visualización.
# Inspección inicial del objeto espacial
print(col_dept)
## Simple feature collection with 33 features and 2 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -81.7237 ymin: -4.236484 xmax: -66.87506 ymax: 13.57836
## Geodetic CRS: WGS 84
## First 10 features:
## name geometry depto_norm
## 1 Nariño MULTIPOLYGON (((-78.47812 1... NARINO
## 2 Putumayo MULTIPOLYGON (((-75.28349 -... PUTUMAYO
## 3 Chocó MULTIPOLYGON (((-77.46937 8... CHOCO
## 4 Guainía MULTIPOLYGON (((-66.87506 1... GUAINIA
## 5 Vaupés MULTIPOLYGON (((-69.84118 1... VAUPES
## 6 Amazonas MULTIPOLYGON (((-69.42107 -... AMAZONAS
## 7 La Guajira MULTIPOLYGON (((-71.32751 1... LA GUAJIRA
## 8 Cesar MULTIPOLYGON (((-72.91523 1... CESAR
## 9 Norte de Santander MULTIPOLYGON (((-73.36364 9... NORTE DE SANTANDER
## 10 Arauca MULTIPOLYGON (((-71.96402 7... ARAUCA
st_geometry_type(col_dept)
## [1] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
## [6] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
## [11] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
## [16] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
## [21] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
## [26] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
## [31] MULTIPOLYGON MULTIPOLYGON MULTIPOLYGON
## 18 Levels: GEOMETRY POINT LINESTRING POLYGON MULTIPOINT ... TRIANGLE
st_crs(col_dept)
## Coordinate Reference System:
## User input: WGS 84
## wkt:
## GEOGCRS["WGS 84",
## DATUM["World Geodetic System 1984",
## ELLIPSOID["WGS 84",6378137,298.257223563,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]],
## CS[ellipsoidal,2],
## AXIS["latitude",north,
## ORDER[1],
## ANGLEUNIT["degree",0.0174532925199433]],
## AXIS["longitude",east,
## ORDER[2],
## ANGLEUNIT["degree",0.0174532925199433]],
## ID["EPSG",4326]]
El objeto espacial col_dept contiene 33 entidades
geográficas correspondientes a los departamentos de Colombia, cada una
representada como un multipolígono en formato sf y
acompañada de atributos limpios que facilitan su integración con datos
administrativos. La inspección del tipo de geometría confirma que todas
las entidades son MULTIPOLYGON, lo que garantiza
homogeneidad estructural y evita inconsistencias en operaciones
espaciales o procesos de visualización. Adicionalmente, el sistema de
referencia espacial asociado es WGS84
(EPSG:4326), el estándar global basado en coordenadas geográficas,
apropiado para análisis exploratorios, visualizaciones web e
interoperabilidad con otras fuentes cartográficas.
Una vez normalizados los nombres, se integran las geometrías con los
indicadores administrativos mediante un left_join() sobre
la clave estandarizada depto_norm.
# Unión espacial (atributos + geometría)
d <- col_dept |>
left_join(analisis_geografico_IPS, by = "depto_norm")
# Vista preliminar del objeto resultante
d |> dplyr::select(name, depto_norm, Núm_prestadores_habilitados, Densidad_Poblacional) |> head()
## Simple feature collection with 6 features and 4 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -79.02151 ymin: -4.236484 xmax: -66.87506 ymax: 8.678412
## Geodetic CRS: WGS 84
## name depto_norm Núm_prestadores_habilitados Densidad_Poblacional
## 1 Nariño NARINO 1716 51.5085367
## 2 Putumayo PUTUMAYO 227 15.7019088
## 3 Chocó CHOCO 276 12.7467440
## 4 Guainía GUAINIA 24 0.8265179
## 5 Vaupés VAUPES 7 0.8154059
## 6 Amazonas AMAZONAS 53 0.7756075
## geometry
## 1 MULTIPOLYGON (((-78.47812 1...
## 2 MULTIPOLYGON (((-75.28349 -...
## 3 MULTIPOLYGON (((-77.46937 8...
## 4 MULTIPOLYGON (((-66.87506 1...
## 5 MULTIPOLYGON (((-69.84118 1...
## 6 MULTIPOLYGON (((-69.42107 -...
La unión espacial se realizó correctamente, ya que se evidencia que las geometrías se integraron sin inconsistencias y los indicadores administrativos aparecen asignados de forma coherente, mostrando que el objeto resultante está listo para los mapas y análisis posteriores.
Después de la unión, se realizan validaciones para asegurar que el objeto espacial resultante es coherente y adecuado para la construcción de mapas. Estas verificaciones permiten asegurar que no existan inconsistencias en los nombres, geometrías corruptas o valores ausentes que puedan afectar la visualización o el análisis espacial posterior.
# 1. Verificar departamentos sin emparejar
faltantes <- d |> filter(is.na(Núm_prestadores_habilitados))
faltantes$name
## character(0)
# 2. Comprobar geometrías válidas
sum(!st_is_valid(d))
## [1] 0
# 3. Revisar valores faltantes en variables clave
colSums(is.na(d[c("Núm_prestadores_habilitados", "Densidad_Poblacional")]))
## Núm_prestadores_habilitados Densidad_Poblacional
## 0 0
## geometry
## 0
# 4. Confirmar el CRS utilizado
st_crs(d)
## Coordinate Reference System:
## User input: WGS 84
## wkt:
## GEOGCRS["WGS 84",
## DATUM["World Geodetic System 1984",
## ELLIPSOID["WGS 84",6378137,298.257223563,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]],
## CS[ellipsoidal,2],
## AXIS["latitude",north,
## ORDER[1],
## ANGLEUNIT["degree",0.0174532925199433]],
## AXIS["longitude",east,
## ORDER[2],
## ANGLEUNIT["degree",0.0174532925199433]],
## ID["EPSG",4326]]
La validación confirma que la unión espacial es completamente consistente: no hay departamentos sin emparejar, todas las geometrías son válidas, las variables clave no tienen valores faltantes y el CRS es WGS84. En conjunto, el objeto espacial está limpio y listo para ser usado en los mapas sin riesgo de errores.
Una vez asegurada la correcta carga y estructura de las geometrías, se construye un mapa base que servirá como capa de referencia para los mapas temáticos posteriores. Este mapa permite validar visualmente la delimitación departamental y confirmar que la cobertura espacial es coherente con la división político-administrativa del país.
A partir del objeto espacial completo, se seleccionan únicamente los
atributos necesarios para el mapa base: (1) nombre del departamento
name, (2) clave normalizada depto_norm y (3)
geometría geometry.
# Selección de atributos esenciales para el mapa base
col_dept_base <- col_dept |>
dplyr::select(name, depto_norm, geometry)
col_dept_base
## Simple feature collection with 33 features and 2 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -81.7237 ymin: -4.236484 xmax: -66.87506 ymax: 13.57836
## Geodetic CRS: WGS 84
## First 10 features:
## name depto_norm geometry
## 1 Nariño NARINO MULTIPOLYGON (((-78.47812 1...
## 2 Putumayo PUTUMAYO MULTIPOLYGON (((-75.28349 -...
## 3 Chocó CHOCO MULTIPOLYGON (((-77.46937 8...
## 4 Guainía GUAINIA MULTIPOLYGON (((-66.87506 1...
## 5 Vaupés VAUPES MULTIPOLYGON (((-69.84118 1...
## 6 Amazonas AMAZONAS MULTIPOLYGON (((-69.42107 -...
## 7 La Guajira LA GUAJIRA MULTIPOLYGON (((-71.32751 1...
## 8 Cesar CESAR MULTIPOLYGON (((-72.91523 1...
## 9 Norte de Santander NORTE DE SANTANDER MULTIPOLYGON (((-73.36364 9...
## 10 Arauca ARAUCA MULTIPOLYGON (((-71.96402 7...
Como primer control visual, se genera un mapa “estático” que permite evaluar rápidamente la cobertura geográfica, la forma de los polígonos y la continuidad de los límites departamentales.
# Visualización estática del mapa base
plot(
st_geometry(col_dept_base),
main = "Mapa base de Colombia - Departamentos",
axes = TRUE
)
La visualización interactiva inicial permite verificar la integridad
espacial del objeto sf antes de incorporar variables
temáticas. Este paso es fundamental para confirmar que:
Los límites departamentales se renderizan sin distorsiones,
no existen geometrías corruptas (polígonos incompletos o vacíos),
el CRS es interpretado correctamente por el motor de visualización,
y la estructura espacial es consistente para los procesos posteriores de clasificación, simbología y sincronización de vistas.
A través de mapview, se obtiene una representación
navegable que facilita la evaluación del mapa base en condiciones reales
de exploración.
mapview(
col_dept_base,
zcol = "name",
map.types = "CartoDB.Positron",
layer.name = "Departamentos de Colombia"
)
mapviewEn esta sección se construye un mapa temático interactivo a nivel
departamental utilizando el número de prestadores habilitados como
variable principal. El flujo incluye: definición de variables, cálculo
de clases mediante el método de Jenks, configuración de la paleta de
colores y generación del mapa interactivo con mapview.
Se definen las variables de análisis y una función genérica para
calcular los puntos de corte (breaks) a partir de la
distribución de los datos. En este caso se utiliza el método de rupturas
naturales de Jenks, adecuado para resaltar agrupamientos en
variables de conteo.
# Variables de interés
var_prest <- "Núm_prestadores_habilitados"
var_dens <- "Densidad_Poblacional"
# Función para calcular cortes (clases) automáticamente
cortes <- function(variable, k = 7, metodo = "jenks"){
vals <- variable[!is.na(variable)]
classInt::classIntervals(vals, n = k, style = metodo)$brks
}
# Filtrar departamentos con dato disponible en la variable de prestadores
d_prest <- d |>
dplyr::filter(!is.na(.data[[var_prest]]))
# Cortes Jenks para la variable de prestadores
brks_prest <- cortes(d_prest[[var_prest]], k = 7, metodo = "jenks")
brks_prest
## [1] 7 276 635 1161 1753 2881 11737 13774
Los puntos de corte obtenidos muestran una distribución altamente desigual del número de prestadores entre departamentos, con saltos amplios entre clases que evidencian concentración del servicio en pocos territorios. Estas rupturas justifican el uso de Jenks para representar adecuadamente esta variabilidad.
Se define una paleta de colores secuencial basada en RColorBrewer
y se ajusta el número de colores al número de clases definido por los
cortes de Jenks. Este esquema es apropiado para variables de intensidad
o conteo.
#Paleta base secuencial
pal_fun <- colorRampPalette(brewer.pal(9, "YlOrRd"))
#Paleta final para el mapa de prestadores
pal_prest <- pal_fun(length(brks_prest) - 1)
pal_prest
## [1] "#FFFFCC" "#FEE692" "#FEBF5A" "#FD8D3C" "#F33C25" "#C90822" "#800026"
La paleta YlOrRd
(amarillo–naranja–rojo) permite identificar visualmente los
departamentos con mayor concentración relativa de prestadores mediante
tonos más intensos. Para explorar más opciones se puede consultar: https://colorbrewer2.org/
Con los cortes y la paleta definidos, se construye el mapa temático interactivo. Cada departamento se colorea según el número de prestadores habilitados, estratificado en las clases determinadas por el método de Jenks.
map_prest <- mapview(
d_prest,
zcol = var_prest, # variable que define el color del mapa
at = brks_prest, # cortes de clase (Jenks)
col.regions = pal_prest, # paleta aplicada a las clases
map.types = "Esri.WorldTopoMap",
layer.name = "Prestadores habilitados"
)
map_prest
El objeto resultante es un mapa interactivo navegable que permite realizar zoom, desplazarse sobre el territorio y consultar los valores asociados a cada departamento mediante interacción directa. El patrón espacial evidencia una alta concentración de prestadores habilitados en Bogotá, Antioquia, Cundinamarca, Santander y Valle del Cauca, conformando el núcleo de mayor oferta en el país. En contraste, departamentos amazónicos y de la Orinoquía presentan baja densidad de prestadores, reflejando brechas estructurales históricas en capacidad instalada y acceso territorial. El gradiente centro–periferia sugiere una asimetría marcada en la distribución de servicios, coherente con la concentración poblacional y el desarrollo de redes asistenciales en las principales aglomeraciones urbanas
El mapa interactivo cumple un rol principalmente exploratorio y su lectura debe considerar varios aspectos:
La variable corresponde a conteos absolutos de prestadores por departamento, por lo que está influenciada por el tamaño poblacional y la concentración urbana.
La clasificación por Jenks optimiza la homogeneidad interna de cada clase, pero no asegura igualdad de frecuencias entre clases ni comparabilidad directa con otros mapas construidos con métodos de clasificación distintos (cuantiles, intervalos iguales, cortes manuales).
La simbología secuencial enfatiza las áreas con mayor número relativo de prestadores, pero no incorpora aún información de necesidad poblacional, accesibilidad ni suficiencia de la oferta.
En análisis más especializados —fuera del alcance de este ejercicio introductorio— se emplearán indicadores normalizados (por población, área o necesidades esperadas) junto con técnicas espaciales avanzadas como tasas suavizadas, autocorrelación espacial y modelos de riesgo. Estos enfoques permiten interpretaciones más sólidas desde la bioestadística y la planificación en salud.
leafsyncEl análisis espacial comparado es una herramienta fundamental cuando se busca evaluar simultáneamente dos indicadores territoriales que pueden presentar relaciones de interés. En este ejercicio se contrastan el número de prestadores habilitados y la densidad poblacional, permitiendo observar si la distribución de la oferta en salud se alinea o no con el tamaño poblacional departamental.
El uso de leafsync facilita esta exploración al permitir
que dos mapas interactivos compartan automáticamente la misma vista,
zoom y posición, lo cual elimina sesgos derivados de diferencias de
escala o encuadre y mejora la precisión visual del análisis
exploratorio.
La sincronización de mapas resulta especialmente útil cuando se comparan indicadores territoriales que presentan escalas, distribuciones o unidades de medida diferentes. Este enfoque permite observar de manera simultánea patrones espaciales, manteniendo un mismo nivel de zoom y un encuadre idéntico en ambas visualizaciones, lo cual evita distorsiones interpretativas y facilita la lectura comparada.
En este ejercicio, la sincronización ayuda a contrastar la distribución de prestadores habilitados frente a la densidad poblacional, permitiendo identificar visualmente territorios donde la capacidad instalada podría no corresponder con el peso demográfico local.
Nota técnica: la densidad poblacional corresponde al
cociente entre la población departamental (DANE 2018) y el área oficial
(Natural Earth).
\[
\text{Densidad} = \frac{\text{Población}}{\text{Área (km}^2\text{)}}
\] En análisis posteriores se calculará el área con
sf::st_area() para validar consistencia.
Es importante señalar que este enfoque es exploratorio y no sustituye un análisis cuantitativo formal. En un análisis complementario se abordarán análisis bivariados, construcción de indicadores derivados (p. ej., prestadores por 10.000 habitantes) y la aplicación de técnicas estadísticas y espaciales más robustas, entre otros:
La sincronización de mapas es, por tanto, una primera aproximación visual que orienta hipótesis y facilita la detección preliminar de patrones espaciales relevantes antes de aplicar métodos estadísticos formales.
# Cálculo de cortes independientes por variable
# Cortes Jenks para densidad poblacional
brks_dens <- cortes(d[[var_dens]], k = 7, metodo = "jenks")
# Paleta asociada
pal_dens <- pal_fun(length(brks_dens) - 1)
brks_dens
## [1] 0.7756075 15.7019088 79.6525580 136.0373663 302.3761518
## [6] 468.0312869 1219.9615385 5033.5025349
# Construcción de los mapas temáticos independientes
# Mapa 1: Prestadores habilitados
m1 <- mapview(
d,
zcol = var_prest,
at = brks_prest,
col.regions = pal_prest,
map.types = "CartoDB.Positron",
na.color = "transparent",
layer.name = "Prestadores habilitados"
)
# Mapa 2: Densidad poblacional
m2 <- mapview(
d,
zcol = var_dens,
at = brks_dens,
col.regions = pal_dens,
map.types = "CartoDB.Positron",
na.color = "transparent",
layer.name = "Densidad poblacional"
)
# Sincronización de vistas con leafsync
sync_map <- leafsync::sync(m1, m2)
sync_map
ggplot2Los mapas estáticos son esenciales cuando se requiere generar insumos
formales para informes técnicos, artículos científicos o presentaciones
institucionales. A diferencia de los mapas interactivos, permiten un
control total sobre la simbología, la tipografía, la disposición gráfica
y la composición general.
En esta sección se construye un mapa coroplético estático de
prestadores habilitados, aplicando cortes de Jenks y una paleta
secuencial que facilita la interpretación visual.
Se emplea el mismo criterio de clasificación (Jenks) utilizado en el análisis interactivo. Para mejorar la lectura del mapa en un entorno estático, se generan etiquetas formateadas con separadores de miles.
# Filtrar departamentos con dato disponible
d_prest_static <- d |>
dplyr::filter(!is.na(.data[[var_prest]]))
# Cortes Jenks para variable de prestadores
brks_prest_static <- cortes(d_prest_static[[var_prest]], k = 7, metodo = "jenks")
# Etiquetas formateadas para la leyenda
labs_brks <- scales::comma(brks_prest_static, accuracy = 1)
labs_clases <- paste0(labs_brks[-length(labs_brks)], " – ", labs_brks[-1])
# Crear variable categórica con rangos
d_prest_static <- d_prest_static |>
mutate(clase_prest = cut(
.data[[var_prest]],
breaks = brks_prest_static,
include.lowest = TRUE,
labels = labs_clases
))
Los mapas “estáticos” requieren posicionar manualmente las etiquetas.
Para ello se utiliza st_point_on_surface(), que garantiza
que el punto quede dentro del polígono incluso en geometrías
complejas.
d_centroid <- d_prest_static |>
mutate(centro = st_point_on_surface(geometry)) |>
mutate(
x = st_coordinates(centro)[,1],
y = st_coordinates(centro)[,2]
)
ggplot2El mapa se diseña utilizando una paleta secuencial de
RColorBrewer, con líneas delgadas para límites
departamentales y etiquetado discreto para evitar saturación visual.
p_mapa_prest <- ggplot() +
geom_sf(
data = d_prest_static,
aes(fill = clase_prest),
color = "black", size = 0.2
) +
geom_text(
data = d_centroid,
aes(x = x, y = y, label = name),
size = 2, color = "gray10", check_overlap = TRUE
) +
scale_fill_brewer(
palette = "YlOrRd",
name = "Prestadores habilitados",
na.translate = FALSE
) +
labs(
title = "Colombia — Prestadores habilitados por departamento",
caption = "Fuentes: REPS (MSPS) y DANE — CNPV 2018"
) +
theme_void() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
legend.position = "right",
plot.caption = element_text(size = 8, hjust = 0, color = "gray30")
)
p_mapa_prest
El mapa final se puede exportar en formato PNG con resolución adecuada para informes técnicos y entregables operativos. No obstante, dependiendo del nivel de detalle requerido o del tipo de análisis —por ejemplo, modelación espacial avanzada, edición cartográfica de alta precisión o requisitos editoriales estrictos— pueden considerarse herramientas más robustas como QGIS, ArcGIS Pro o flujos vectoriales en PDF/SVG que ofrecen mayor control sobre simbología, composición y tratamiento del espacio.
ggsave(
filename = "mapa_prestadores_hd.png",
plot = p_mapa_prest,
width = 14,
height = 8,
units = "in",
dpi = 300
)
Este flujo constituye una base replicable para análisis espaciales
simples en R, adaptable a distintos indicadores y niveles
territoriales.
Para consultas técnicas o ampliación
metodológica:🔗LinkedIn: https://www.linkedin.com/in/camilogz