#activo los siguentes paquetes
library(sf)
library(tidyverse)
library(readxl)
library(DT)
library(classInt) # Para calcular los Natural Breaks en mapas
library(scales)
library(RColorBrewer)
library(leaflet)
library(htmltools)
library(ggspatial)
library(prettymapr)
options(scipen = 999)
Mapas_Neuquen
Elaboración de mapas en R
Para hacer mapas en R, existen varios paquetes que facilitan el trabajo con datos espaciales:
sf
: Permite trabajar con datos espaciales de manera eficiente, soportando la lectura, escritura y manipulación de archivos de formato shapefile (SHP).tmap
: Ideal para crear mapas estáticos y dinámicos con una interfaz intuitiva.ggplot2
congeom_sf
: También se puede usar para visualizar datos espaciales dentro del entorno de gráficos de ggplot.leaflet
: Permite crear mapas interactivos basados en web directamente desde R.
¿Qué es un archivo SHP?
Un archivo SHP (Shapefile) es un formato común para almacenar datos geoespaciales vectoriales. Contiene información sobre la geometría de los objetos espaciales (puntos, líneas o polígonos), como regiones o límites administrativos, que se puede visualizar en un mapa.
¿Qué es una proyección?
Una proyección cartográfica es un método para representar la superficie curva de la Tierra en un plano. Cada proyección tiene distorsiones en área, forma, distancia o dirección, y es fundamental elegir la proyección adecuada según el análisis que se quiera realizar. Las más comunes son las proyecciones UTM y la WGS84.
Lectura de archivos shape o geojson
Descargar archivos geoespaciales
Para obtener los polígonos de los departamentos de Argentina, diríjanse a la siguiente página:
Allí podrán descargar los archivos en formato SHP o GeoJSON.
Leer archivos SHP o GeoJSON en R
Puedo obtener capas con información geoespacial utilizando los geoservicios de la provincia:
SIG COPADE Puede consumir nuestras capas mediante nuestros geoservicios
- OWS: https://giscopade.neuquen.gov.ar/geoserver/ows
- WMS: https://giscopade.neuquen.gov.ar/geoserver/wms
- WFS: https://giscopade.neuquen.gov.ar/geoserver/wfs
Una vez descargados los archivos, pueden leerlos en R utilizando el siguiente código:
# Leer el archivo SHP localmente
<- read_sf("departamentos_neuquen.shp")
departamentos <- read_sf("regiones_neuquen.shp")
regiones # Visualizar los primeros registros del shapefile
head(departamentos)
Simple feature collection with 6 features and 15 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: -71.96569 ymin: -41.10059 xmax: -68.83905 ymax: -37.24332
Geodetic CRS: WGS 84
# A tibble: 6 × 16
GmlID nombre perimetro region gob_local fdc area objeto ult_act ed_usu
<chr> <chr> <dbl> <chr> <chr> <chr> <dbl> <chr> <date> <dbl>
1 depto… Picún… 292567. del P… Picún Le… Inst… 4.59e9 Depar… 1899-12-30 2
2 depto… Zapala 385466. del P… Zapala, … Inst… 5.22e9 Depar… 1899-12-30 2
3 depto… Alumi… 378833. de lo… Villa Pe… Inst… 4.74e9 Depar… 1899-12-30 2
4 depto… Lácar 384585. de lo… San Mart… Inst… 4.98e9 Depar… 1899-12-30 2
5 depto… Los L… 361578. de lo… Villa La… Inst… 4.22e9 Depar… 1899-12-30 2
6 depto… Ñorqu… 397406. Vaca … Caviahue… Inst… 5.55e9 Depar… 1899-12-30 2
# ℹ 6 more variables: fna <chr>, gna <chr>, parajes <chr>, Shape_Leng <dbl>,
# Shape_Area <dbl>, geometry <POLYGON [°]>
head(regiones)
Simple feature collection with 6 features and 11 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -71.96569 ymin: -41.10059 xmax: -67.99796 ymax: -36.10991
Geodetic CRS: WGS 84
# A tibble: 6 × 12
GmlID region depto ed_usu ult_act observacio gob_local fdc sitio_web
<chr> <chr> <chr> <dbl> <date> <chr> <chr> <chr> <chr>
1 regiones.1 de la… Conf… 2 1899-12-30 <NA> Cutral C… Cons… https://…
2 regiones.2 Confl… Conf… 2 1899-12-30 <NA> Plottier… Cons… https://…
3 regiones.3 del L… Coll… 2 1899-12-30 <NA> Picún Le… Cons… https://…
4 regiones.4 Alto … Chos… 2 1899-12-30 <NA> Las Ovej… Cons… https://…
5 regiones.5 de lo… Catá… 2 1899-12-30 Incluye p… Villa La… Cons… https://…
6 regiones.6 Vaca … Añel… 2 1899-12-30 <NA> Buta Ran… Cons… https://…
# ℹ 3 more variables: Shape_Leng <dbl>, Shape_Area <dbl>,
# geometry <MULTIPOLYGON [°]>
Veamos que variables tiene mi dataset de Regiones
plot(regiones)
Warning: plotting the first 10 out of 11 attributes; use max.plot = 11 to plot
all
Mostraremos filtrado un recorte de mapa
<- regiones %>%
neuquen_2::filter(depto== "Confluencia")
dplyr
::datatable(neuquen_2) DT
plot(neuquen_2)
Warning: plotting the first 9 out of 11 attributes; use max.plot = 11 to plot
all
ggplot()+
geom_sf(data = neuquen_2)
Leer dataset de casos de dengue
<- load("tabal1_DENGUE.RData") datos_dengue
# Crear la nueva variable para el mapeo
<- tabla1 %>%
tabla1 mutate(
region_match = case_when(
`Region Sanitaria` == "Sur" ~ "de los Lagos del Sur",
`Region Sanitaria` == "Limay Medio" ~ "del Limay",
`Region Sanitaria` == "Comarca Petrolera" ~ "de la Comarca",
`Region Sanitaria` == "Norte" ~ "Alto Neuquén",
`Region Sanitaria` == "Centro Oeste" ~ "del Pehuén",
`Region Sanitaria` == "Vaca muerta" ~ "Vaca Muerta",
TRUE ~ `Region Sanitaria` # Los que son iguales se mantienen igual
)
)
# Verificar las nuevas categorías de la variable creada
levels(as.factor(tabla1$region_match))
[1] "Alto Neuquén" "Confluencia" "de la Comarca"
[4] "de los Lagos del Sur" "del Limay" "del Pehuén"
[7] "Total" "Vaca Muerta"
#Union de datasets
<- regiones %>%
casos_dengue_mapa left_join(tabla1, by = c( "region"="region_match"))
::datatable(casos_dengue_mapa) DT
Elaboración de mapa en ggplot2
# Calcular los cortes utilizando quantiles
<- classInt::classIntervals(casos_dengue_mapa$`Tasa de confirmados*`, n = 3, style = "quantile",cutlabels=F)$brks
breaks
breaks
[1] 0.0 21.6 25.7 45.0
# Crear las categorías basadas en los Natural Breaks
<- casos_dengue_mapa %>%
casos_dengue_mapa mutate(tasa_categoria = cut(`Tasa de confirmados*`,
breaks = breaks,
dig.lab = 5,
include.lowest = T))
table(casos_dengue_mapa$tasa_categoria)
[0,21.6] (21.6,25.7] (25.7,45]
3 2 2
# Crear el mapa con categorías en base a quintiles
ggplot() +
# Agregar mapa de fondo
#annotation_map_tile(type = "cartolight") + # Usa "cartolight" como fondo, puedes cambiar a otros
geom_sf(data = casos_dengue_mapa,
aes(fill = tasa_categoria,
geometry = geometry),
color = 'black',
size = 0.2) +
scale_fill_brewer(palette = "YlOrRd", name = "Casos Confirmados",
+ # Escala de colores y leyenda
) labs(title = "Tasa de confirmados de dengue por region Sanitaria*",
fill = "Tasa de confirmados*",
caption = "*aca porner alguna ingormacion adicional o aclaracion\n Fuente: Elaboración prpia con datos de la direccion de Epidemiología.") + # Título y leyenda
# Agregar la escala
annotation_scale(location = "bl", width_hint = 0.2,
bar_cols = c("black", "white"), # Alternar colores para cada parte
text_col = "black", # Color del texto de la escala
style = "ticks") + # Divisiones de la escala
# Agregar la rosa de los vientos
annotation_north_arrow(location = "tr", which_north = "true", # "tr" es "top right"
pad_x = unit(0.3, "in"), pad_y = unit(0.3, "in"),
style = north_arrow_fancy_orienteering,
height = unit(1, "cm"), width = unit(1, "cm")) +
theme_minimal()
Uso del paquete Leaflet
Ahora vamos a hacer el mismo mapa con el paquete Leaflet
El paquete Leaflet es una herramienta poderosa y fácil de usar para crear mapas interactivos en R. A continuación, se describen algunos aspectos importantes a tener en cuenta al usar Leaflet:
Mapas base (Tiles): Leaflet permite agregar mapas base de diferentes proveedores, como OpenStreetMap, CartoDB, o Esri. Para agregar un mapa de fondo, usamos
addProviderTiles()
.leaflet() %>% addProviderTiles("OpenStreetMap") %>% addPolygons(...) # Agregar polígonos u otras capas
Capas de datos: Puedes agregar datos vectoriales como polígonos (
addPolygons()
), puntos (addMarkers()
), o líneas (addPolylines()
) sobre el mapa. Los datos deben estar en formatosf
osp
.Paletas de colores: Para visualizar variables numéricas en mapas, se usan funciones como
colorNumeric()
,colorBin()
, ocolorQuantile()
para asignar colores a los valores de las variables.<- colorBin(palette = "YlOrRd", domain = datos$variable, bins = 5) pal
Interactividad: Leaflet permite agregar etiquetas o popups interactivos que muestran información cuando el usuario hace clic o pasa el ratón sobre los elementos. Puedes personalizarlos con HTML y las funciones
label
opopup
.
# Calcular los cortes utilizando Jenks Natural Breaks
<- classInt::classIntervals(casos_dengue_mapa$`Tasa de confirmados*`, n = 3, style = "jenks")$brks
breaks
# Crear una paleta de colores basada en los Natural Breaks
<- colorBin(palette = "YlOrRd",
pal domain = casos_dengue_mapa$`Tasa de confirmados*`,
bins = breaks)
# Crear el mapa en Leaflet
<- paste0("<strong>Departamento:</strong> ", casos_dengue_mapa$region, "<br>","<strong>Tasa de Confirmados:</strong> ",casos_dengue_mapa$`Tasa de confirmados*`)
labeltext
leaflet(casos_dengue_mapa) %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(
fillColor = ~pal(casos_dengue_mapa$`Tasa de confirmados*`),
color = "black",
weight = 1,
fillOpacity = 0.7,
label = lapply(labeltext, htmltools::HTML),
highlightOptions = highlightOptions(
weight = 3,
color = "white",
bringToFront = TRUE
)%>%
) addLegend(pal = pal,
values = ~casos_dengue_mapa$tasa_categoria,
opacity = 0.7,
title = "Tasa de Confirmados",
position = "bottomright") %>%
#Agrego escala
addScaleBar(position = "bottomleft", options = scaleBarOptions(imperial = FALSE))
1. Natural Breaks (Jenks)
Descripción:
Método: Divide los datos en grupos que minimizan la varianza dentro de cada grupo e incrementan la varianza entre grupos. Busca encontrar los “puntos de ruptura naturales” en los datos.
Ventaja: Se adapta a la distribución de los datos. Ideal para datos con valores concentrados en ciertas áreas o con grandes diferencias entre los valores mínimos y máximos.
Desventaja: Los intervalos pueden ser desiguales, lo que dificulta la interpretación en términos generales.
Cuándo usar Natural Breaks:
Cuando los datos no tienen una distribución uniforme y presentan agrupamientos o patrones.
Para resaltar diferencias significativas o “saltos” naturales en los datos.
En mapas donde se busca enfatizar diferencias claras (e.g., tasas de pobreza o densidad poblacional en regiones heterogéneas).
2. Cuantiles
Descripción:
Método: Divide los datos en grupos con igual número de observaciones (por ejemplo, 4 grupos para cuartiles o 5 para quintiles).
Ventaja: Produce intervalos con igual cantidad de elementos, lo que resulta en un mapa visualmente equilibrado.
Desventaja: Si los datos están muy concentrados en ciertos rangos, intervalos consecutivos pueden representar valores muy similares, lo que puede diluir diferencias importantes.
Cuándo usar Cuantiles:
Cuando el objetivo es comparar regiones o grupos en términos relativos (e.g., “el 20% superior de regiones con la mayor incidencia de dengue”).
En mapas donde se busca una distribución uniforme de colores o áreas, útil para resaltar desigualdades generales.
Cuando los datos están aproximadamente distribuidos de manera uniforme.
Agregar capa de puntos al mapa de poligonos
Primero cargo mi capa de puntos
<- read_sf("centros_neuquen.shp") centros_salud
# Calcular los cortes utilizando quantiles
<- classInt::classIntervals(casos_dengue_mapa$`Tasa de confirmados*`, n = 3, style = "quantile",cutlabels=F)$brks
breaks
breaks
[1] 0.0 21.6 25.7 45.0
# Crear las categorías basadas en los Natural Breaks
<- casos_dengue_mapa %>%
casos_dengue_mapa mutate(tasa_categoria = cut(`Tasa de confirmados*`,
breaks = breaks,
dig.lab = 5,
include.lowest = T))
table(casos_dengue_mapa$tasa_categoria)
[0,21.6] (21.6,25.7] (25.7,45]
3 2 2
# Crear el mapa con categorías en base a quintiles
ggplot() +
# Agregar mapa de fondo
#annotation_map_tile(type = "cartolight") + # Usa "cartolight" como fondo, puedes cambiar a otros
geom_sf(data = casos_dengue_mapa,
aes(fill = tasa_categoria,
geometry = geometry),
color = 'black',
size = 0.2) +
geom_sf(data= centros_salud, aes(col="Centros de salud"))+
scale_fill_brewer(palette = "YlOrRd", name = "Casos Confirmados"
+ # Escala de colores y leyenda
) scale_color_manual(values = "black", name = "Centros de salud"
+#color para los puntos
) labs(title = "Tasa de confirmados de dengue por region Sanitaria*, Neuquén. Año 2024",
fill = "Tasa de confirmados*",
caption = "*aca porner alguna ingormacion adicional o aclaracion\n Fuente: Elaboración prpia con datos de la direccion de Epidemiología.") + # Título y leyenda
# Agregar la escala
annotation_scale(location = "bl", width_hint = 0.2,
bar_cols = c("black", "white"), # Alternar colores para cada parte
text_col = "black", # Color del texto de la escala
style = "ticks") + # Divisiones de la escala
# Agregar la rosa de los vientos
annotation_north_arrow(location = "tr", which_north = "true", # "tr" es "top right"
pad_x = unit(0.3, "in"), pad_y = unit(0.3, "in"),
style = north_arrow_fancy_orienteering,
height = unit(1, "cm"), width = unit(1, "cm")) +
theme_minimal()