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
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).
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.
Marcadores Personalizables: Leaflet ofrece la posibilidad de personalizar los marcadores (íconos, colores, tamaños) y añadir popups informativos para cada uno.
Soporte para GeoJSON: Permite la importación y visualización de datos geoespaciales en formato GeoJSON, facilitando la representación de geometrías complejas.
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.
Compatibilidad con Dispositivos Móviles: Los mapas son responsivos y funcionan bien en dispositivos móviles, garantizando una buena experiencia de usuario.
Extensibilidad: Leaflet puede ser ampliado mediante complementos (plugins) que permiten agregar nuevas funcionalidades, como gráficos de tiempo, clusters de puntos, y más.
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
Mapas Base:
Mapas de mosaico (Tiles): Proporcionan una capa base de fondo (OpenStreetMap, Google Maps, etc.).
Mapas de satélite y otros estilos personalizados.
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).
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.
Capas de Calor (Heatmaps):
- Visualizan la densidad de puntos en un área específica, utilizando colores para representar la intensidad.
Gráficos de Tiempos:
- Permiten visualizar datos a lo largo del tiempo, añadiendo un componente temporal a los mapas.
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).
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
.
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)Usando
ineapir
extraemos los datos usando el servicio API del INE. Aplicandoget_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 nacional70
: ccaa115
: provincias19
: 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]))
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:
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)Usando
ineapir
extraemos los datos usando el servicio API del INE. Ejecutandoget_metadata_table_varval(13930)
vemos que debemos filtrar por jornada a tiempo completo, todas ccaa, y total decil.
## 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 nacional70
: ccaa115
: provincias19
: municipios
En nuestro caso necesitamos el de las comunidades autónomas.
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]))