7 Leaflet

Leaflet es un paquete que permite integrar mapas interactivos en aplicaciones web y en documentos R. Utiliza la biblioteca JavaScript Leaflet, lo que proporciona una gran cantidad de funcionalidades para visualizar datos geoespaciales de forma intuitiva. Con Leaflet, puedes agregar marcadores, polígonos, capas de datos y muchos otros elementos a tus mapas. Su simplicidad y flexibilidad lo hacen ideal para visualizaciones geográficas en proyectos de análisis de datos.

7.1 General

7.1.1 Características Principales de Leaflet

  1. Interactividad: Leaflet permite crear mapas interactivos donde los usuarios pueden acercar, alejar y hacer clic en elementos para obtener información adicional a través de ventanas emergentes (popups).

  2. Capas Múltiples: Puedes agregar diferentes tipos de capas al mapa, como capas de imagen, capas de mosaico, y datos vectoriales, lo que permite superponer información.

  3. Marcadores Personalizables: Leaflet ofrece la posibilidad de personalizar los marcadores (íconos, colores, tamaños) y añadir popups informativos para cada uno.

  4. Soporte para GeoJSON: Permite la importación y visualización de datos geoespaciales en formato GeoJSON, facilitando la representación de geometrías complejas.

  5. Simplicidad de Uso: La sintaxis es intuitiva y sencilla, lo que permite a los usuarios crear mapas rápidamente con un código mínimo.

  6. Compatibilidad con Dispositivos Móviles: Los mapas son responsivos y funcionan bien en dispositivos móviles, garantizando una buena experiencia de usuario.

  7. Extensibilidad: Leaflet puede ser ampliado mediante complementos (plugins) que permiten agregar nuevas funcionalidades, como gráficos de tiempo, clusters de puntos, y más.

  8. Temas Personalizables: Se pueden aplicar diferentes estilos y temas a los mapas para adaptarlos a la visualización deseada.

7.1.2 Tipos de Gráficos en Leaflet

  1. Mapas Base:

    • Mapas de mosaico (Tiles): Proporcionan una capa base de fondo (OpenStreetMap, Google Maps, etc.).

    • Mapas de satélite y otros estilos personalizados.

  2. Marcadores:

    • Marcadores Simples: Puntos que indican ubicaciones específicas en el mapa.

    • Marcadores Agrupados: Agrupan varios marcadores en una sola vista para evitar el desorden visual (clustering).

  3. Polígonos y Líneas:

    • Polígonos: Representan áreas geográficas específicas (ejemplo: límites de comunidades autónomas).

    • Líneas: Representan rutas o trayectorias, como carreteras o caminos.

  4. Capas de Calor (Heatmaps):

    • Visualizan la densidad de puntos en un área específica, utilizando colores para representar la intensidad.
  5. Gráficos de Tiempos:

    • Permiten visualizar datos a lo largo del tiempo, añadiendo un componente temporal a los mapas.
  6. Visualización de Datos:

    • Data Binding: Vincula datos a los marcadores o polígonos para mostrar información adicional (por ejemplo, población, estadísticas).
  7. Mapas de Coropletas:

    • Representan datos cuantitativos a través de variaciones en el color de las áreas geográficas, ideal para visualizar indicadores como la población o la densidad de un fenómeno.

7.2 Mapas

7.2.1 Ejemplo esperanza de vida

Vamos a representar la esperanza de vida por comunidades autónomas en un mapa de España. Para ello necesitamos extraer primero los datos, que como ya se ha comentado previamente se obtienen a partir del paquete ineapir.

  1. En la web del ine buscamos la tabla que contiene los datos deseados, que tiene por id 27154. (Véase https://www.ine.es/jaxiT3/Tabla.htm?t=13930&L=0)

  2. Usando ineapir extraemos los datos usando el servicio API del INE. Aplicando get_metadata_table_varval(27154)

get_metadata_table_varval(27154)
##        Id Fk_Variable                                         Nombre Codigo
## 1    8997          70                                      Andalucía     01
## 2    8998          70                                         Aragón     02
## 3    8999          70                        Asturias, Principado de     03
## 4    9000          70                                 Balears, Illes     04
## 5    9001          70                                       Canarias     05
## 6    9002          70                                      Cantabria     06
## 7    9003          70                                Castilla y León     07
## 8    9004          70                           Castilla - La Mancha     08
## 9    9005          70                                       Cataluña     09
## 10   9006          70                           Comunitat Valenciana     10
## 11   9007          70                                    Extremadura     11
## 12   9008          70                                        Galicia     12
## 13   9009          70                           Madrid, Comunidad de     13
## 14   9010          70                              Murcia, Región de     14
## 15   9011          70                    Navarra, Comunidad Foral de     15
## 16   9012          70                                     País Vasco     16
## 17   9013          70                                      Rioja, La     17
## 18   9015          70                                          Ceuta     18
## 19   8995          70                                        Melilla     19
## 20    451          18                                          Total       
## 21    452          18                                        Hombres      1
## 22    453          18                                        Mujeres      6
## 23  15319         355                                         0 años     Y0
## 24  15659         360                                  De 1 a 4 años   Y1T4
## 25  15664         360                                  De 5 a 9 años   Y5T9
## 26  15660         360                                De 10 a 14 años Y10T14
## 27  15665         360                                De 15 a 19 años Y15T19
## 28  15661         360                                De 20 a 24 años Y20T24
## 29  15666         360                                De 25 a 29 años Y25T29
## 30  15662         360                                De 30 a 34 años Y30T34
## 31  15658         360                                De 35 a 39 años Y35T39
## 32  15663         360                                De 40 a 44 años Y40T44
## 33  15667         360                                De 45 a 49 años Y45T49
## 34  15648         360                                De 50 a 54 años Y50T54
## 35  15649         360                                De 55 a 59 años Y55T59
## 36  15650         360                                De 60 a 64 años Y60T64
## 37  15651         360                                De 65 a 69 años Y65T69
## 38  15652         360                                De 70 a 74 años Y70T74
## 39  15653         360                                De 75 a 79 años Y75T79
## 40  15654         360                                De 80 a 84 años Y80T84
## 41  15655         360                                De 85 a 89 años Y85T89
## 42 284344         357                                  90 y más años Y-GE90
## 43  15656         360                                De 90 a 94 años Y90T94
## 44  15657         357                                  95 y más años Y-GE95
## 45  22189         260                             Tasa de mortalidad       
## 46 311510         260 Promedio de años vividos el último año de vida       
## 47 311511         260                               Riesgo de muerte       
## 48 311512         260                                 Supervivientes       
## 49 311513         260                           Defunciones teóricas       
## 50 311514         260                         Población estacionaria       
## 51 311515         260                               Tiempo por vivir       
## 52 284290         260                              Esperanza de vida

Vemos que necesitamos filtrar por:

  • ccaa: Seleccionar todas.
  • sexo: Total.
  • Edad: 0 años
  • Tipo de dato: Esperanza de vida.
# Filtrar por esperanza de vida
# "" para indicar que tome todos los valores
filter = list(ccaa = "", sexo = "total", values = c("0 años", "esperanza de vida"))

# Tabl de mortalidad por año, ccaa, ciudadaes, sexo, edad y funciones. 
# Table url: https://www.ine.es/jaxiT3/Tabla.htm?t=27154&L=0
esp <- get_data_table(idTable = 27154, filter = filter, nlast = 1, unnest = TRUE,
                       metacodes = TRUE, tip = "AM", validate = FALSE,verbose = TRUE)
## - Processing filter: 0% - Processing filter: 12%        - Processing filter: 25%        - Processing filter: 38%        - Processing filter: 50%        - Processing filter: 62%        - Processing filter: 75%        - Processing filter: 88%        - Processing filter: 100%        - Processing filter: 100%         
## - API URL: https://servicios.ine.es/wstempus/js/ES/DATOS_TABLA/27154?nult=1&tip=AM&ver=3&tv=70%3A&tv=18%3A451&tv=355%3A15319&tv=260%3A284290
# Seleccionamos columnas de interés
esp <- subset(esp, select = c("Comunidades.y.Ciudades.Autónomas.Id", "T3_Periodo",
                                "Anyo","Valor"))

7.2.1.1 Contornos

Una vez obtenidos los datos que se quieren incluir en el mapa, es necesario disponer de los contornos geográficos sobre los cuales se quieren representar dichos datos. En este caso, los contornos de las comunidades autónomas.

El ine dispone acceso de contornos para los limites geográficos en la siguiente web:

Web https://www.ine.es/wstempus/geojs/ES/CONTORNOS/XXXX

sustituyendo XXXX por el código del ámbito geográfico necesario, siendo estos:

  • 349: total nacional
  • 70: ccaa
  • 115: provincias
  • 19: municipios

Para colorear el mapa, se desea que se muestren colores para intervalos de Esperanza de Vida (tomando los cuartiles), para ello será necesario usar la función colorBin(). Por tanto, tenemos:

# Verificar si los paquetes están instalados
if (!require("leaflet")) install.packages("leaflet")
if (!require("sf")) install.packages("sf")
if (!require("htmltools")) install.packages("htmltools")

# Cargar paquete
library(leaflet)
library(sf)
library(htmltools)

# Contornos de las ccaa
ccaa <- read_sf("https://www.ine.es/wstempus/geojs/ES/CONTORNOS/70")



# join de los contornos y el dataset
ccaa <- merge(ccaa, esp, by.x = "id_region", 
              by.y = "Comunidades.y.Ciudades.Autónomas.Id" )

# Creamos colores para cada rango de esperanza de vida
pal <- colorBin("plasma", domain = NULL, bins = c(quantile(ccaa$Valor)))

# Labels of the map
labels <- sprintf(
  "<strong>%s</strong><br/> Esperanza de vida al nacimiento: %.2f años ",
  ccaa$nom_region, ccaa$Val
) %>% lapply(htmltools::HTML)

# Create the map
m <- leaflet(ccaa) %>% 
  addProviderTiles(providers$Esri.WorldImagery) %>%
  setView(-4, 40, zoom = 5) %>%
  addPolygons(fillOpacity = 0.8,
              fillColor = ~pal(Valor),
              weight = 1,
              color = "white",
              label = labels,
              labelOptions = labelOptions(
                style = list("font-weight" = "normal", padding = "3px 8px"),
                textsize = "15px",
                direction = "auto"
              ),
              highlightOptions = highlightOptions(fillOpacity = 1, bringToFront = TRUE, 
                                                  weight = 2, color = "white")
  ) %>%
  addLegend(pal = pal, values = ~Valor, opacity = 1.0, position = "bottomright",
            labFormat = labelFormat(suffix = " años", digits = 2),
            title = sprintf("Esperanza de vida al nacimiento (%s)",
                            esp$Anyo[1]))
m

7.2.2 Ejemplo salario medio

Ahora vamos a representar en un mapa el salario bruto mensual medio en cada comunidad autónoma para el año 2022. Para ello necesitamos:

  1. En la web del ine buscamos la tabla que contiene los datos deseados, que tiene por id 13930. (Véase https://www.ine.es/jaxiT3/Tabla.htm?t=13930&L=0)

  2. Usando ineapir extraemos los datos usando el servicio API del INE. Ejecutando get_metadata_table_varval(13930) vemos que debemos filtrar por jornada a tiempo completo, todas ccaa, y total decil.

# "" para indicar que tome todos los valores
get_metadata_table_varval(13930)
##        Id Fk_Variable                      Nombre Codigo
## 1   10757         120                       Total       
## 2   10758         120   Jornada a tiempo completo       
## 3   10759         120    Jornada a tiempo parcial       
## 4   16473         349              Total Nacional     00
## 5    8997          70                   Andalucía     01
## 6    8998          70                      Aragón     02
## 7    8999          70     Asturias, Principado de     03
## 8    9000          70              Balears, Illes     04
## 9    9001          70                    Canarias     05
## 10   9002          70                   Cantabria     06
## 11   9003          70             Castilla y León     07
## 12   9004          70        Castilla - La Mancha     08
## 13   9005          70                    Cataluña     09
## 14   9006          70        Comunitat Valenciana     10
## 15   9007          70                 Extremadura     11
## 16   9008          70                     Galicia     12
## 17   9009          70        Madrid, Comunidad de     13
## 18   9010          70           Murcia, Región de     14
## 19   9011          70 Navarra, Comunidad Foral de     15
## 20   9012          70                  País Vasco     16
## 21   9013          70                   Rioja, La     17
## 22   9015          70                       Ceuta     18
## 23   8995          70                     Melilla     19
## 24 298931         684                 Total decil       
## 25 298932         684                           1       
## 26 298933         684                           2       
## 27 298934         684                           3       
## 28 298935         684                           4       
## 29 298936         684                           5       
## 30 298937         684                           6       
## 31 298938         684                           7       
## 32 298939         684                           8       
## 33 298940         684                           9       
## 34 298941         684                          10

Vemos que necesitamos filtrar por:

  • Tipo: Jornada a tiempo completo
  • ccaa: Seleccionar todas.
  • Decil: Total decil
# Filtrar por esperanza de vida


filter2 = list( 
  "120" = "10758", # Jornada a tiempo completo
   "70" = "",      # Todas ccaa
  "684" = "298931" # Total decil
  )

# Tabl de mortalidad por año, ccaa, ciudadaes, sexo, edad y funciones. 
# Table url: https://www.ine.es/jaxiT3/Tabla.htm?t=27154&L=0
esp2 <- get_data_table(idTable = 13930, filter = filter2, nlast = 1, unnest = TRUE,
                       metacodes = TRUE, tip = "AM", validate = FALSE)

# Seleccionamos columnas de interés
esp2 <- subset(esp2, select = c("Comunidades.y.Ciudades.Autonómas.Id","Anyo","Valor"))

7.2.2.1 Contornos

Una vez obtenidos los datos que se quieren incluir en el mapa, es necesario disponer de los contornos geográficos sobre los cuales se quieren representar dichos datos. En este caso, los contornos de las comunidades autónomas.

El ine dispone acceso de contornos para los limites geográficos en la siguiente web:

Web https://www.ine.es/wstempus/geojs/ES/CONTORNOS/XXXX

sustituyendo XXXX por el código del ámbito geográfico necesario, siendo estos:

  • 349: total nacional
  • 70: ccaa
  • 115: provincias
  • 19: municipios

En nuestro caso necesitamos el de las comunidades autónomas.

# Contornos de las ccaa
ccaa2 <- read_sf("https://www.ine.es/wstempus/geojs/ES/CONTORNOS/70")

Para colorear el mapa, se desea que se muestren colores para intervalos de Esperanza de Vida (tomando los cuartiles), para ello será necesario usar la función colorBin(). Por tanto, tenemos:

# join de los contornos y el dataset
ccaa2 <- merge(ccaa2, esp2, by.x = "id_region", 
              by.y = "Comunidades.y.Ciudades.Autonómas.Id" )

# Creamos colores para cada rango de esperanza de vida
pal2 <- colorNumeric("plasma",domain= NULL)

# Labels of the map
labels <- sprintf(
  "<strong>%s</strong><br/> Sueldo bruto mensual %s € ",
  ccaa2$nom_region, format(ccaa2$Val, big.mark = ".", decimal.mark = ",", nsmall = 2)
) %>% lapply(htmltools::HTML)


# Create the map
m2 <- leaflet(ccaa2) %>% 
  addProviderTiles(providers$Esri.WorldImagery) %>%
  setView(-4, 40, zoom = 5) %>%
  addPolygons(fillOpacity = 0.8,
              fillColor = ~pal2(Valor),
              weight = 1,
              color = "white",
              label = labels,
              labelOptions = labelOptions(
                style = list("font-weight" = "normal", padding = "3px 8px"),
                textsize = "15px",
                direction = "auto"
              ),
              highlightOptions = highlightOptions(fillOpacity = 1, bringToFront = TRUE, 
                                                  weight = 2, color = "white")
              )%>%  addLegend(pal = pal2, values = ~Valor, position = "bottomleft",
            labFormat = labelFormat(suffix = " €", digits = 2,big.mark = "."),
            title = sprintf("Sueldo bruto mensual (%i)", esp2$Anyo[1]))
m2