Mapas_Neuquen

Elaboración de mapas en R

Para hacer mapas en R, existen varios paquetes que facilitan el trabajo con datos espaciales:

  1. sf: Permite trabajar con datos espaciales de manera eficiente, soportando la lectura, escritura y manipulación de archivos de formato shapefile (SHP).

  2. tmap: Ideal para crear mapas estáticos y dinámicos con una interfaz intuitiva.

  3. ggplot2 con geom_sf: También se puede usar para visualizar datos espaciales dentro del entorno de gráficos de ggplot.

  4. 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

#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)

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
departamentos <- read_sf("departamentos_neuquen.shp")
regiones <- read_sf("regiones_neuquen.shp")
# 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

neuquen_2<- regiones %>% 
  dplyr::filter(depto== "Confluencia")

DT::datatable(neuquen_2)
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

datos_dengue <- load("tabal1_DENGUE.RData")
# 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
casos_dengue_mapa <- regiones %>%
  left_join(tabla1, by = c( "region"="region_match"))

DT::datatable(casos_dengue_mapa)

Elaboración de mapa en ggplot2

# Calcular los cortes utilizando quantiles
breaks <- classInt::classIntervals(casos_dengue_mapa$`Tasa de confirmados*`, n = 3, style = "quantile",cutlabels=F)$brks

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:

  1. 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 
  2. 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 formato sf o sp.

  3. Paletas de colores: Para visualizar variables numéricas en mapas, se usan funciones como colorNumeric(), colorBin(), o colorQuantile() para asignar colores a los valores de las variables.

    pal <- colorBin(palette = "YlOrRd", domain = datos$variable, bins = 5)
  4. 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 o popup.

# Calcular los cortes utilizando Jenks Natural Breaks
breaks <- classInt::classIntervals(casos_dengue_mapa$`Tasa de confirmados*`, n = 3, style = "jenks")$brks

# Crear una paleta de colores basada en los Natural Breaks
pal <- colorBin(palette = "YlOrRd", 
                domain = casos_dengue_mapa$`Tasa de confirmados*`, 
                bins = breaks)

# Crear el mapa en Leaflet

labeltext <- paste0("<strong>Departamento:</strong> ", casos_dengue_mapa$region, "<br>","<strong>Tasa de Confirmados:</strong> ",casos_dengue_mapa$`Tasa de confirmados*`)

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

centros_salud <- read_sf("centros_neuquen.shp")
# Calcular los cortes utilizando quantiles
breaks <- classInt::classIntervals(casos_dengue_mapa$`Tasa de confirmados*`, n = 3, style = "quantile",cutlabels=F)$brks

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()