2018-06-18

Mapa coroplético de España con leaflet para R

Problema

Crear un mapa coroplético con leaflet es muy sencillo. En nuestro ejemplo, crearemos un mapa coroplético de España con el número de habitantes por provincia. El resultado final es este:

Solución

  1. Obtener datos espaciales
  2. Necesitamos obtener datos espaciales (df_pol, un SpatialPolygonDataFrame) para añadir los polígonos con los bordes de las regiones al mapa.

    library(leaflet)
    library(dplyr)
    library(RColorBrewer)
    
    df_pol <- readRDS("ESP_adm2.rds")
    
  3. Obtener datos poblacionales
  4. Descargamos los datos poblacionales (df_pob) para colorear el mapa. Los descargamos del INE.

    df_pob <-  read.csv2("2852sc.csv", dec = ".", stringsAsFactors = FALSE)
    
  5. Unimos ambos
  6. Antes de unir df_pol y df_pob, tenemos que manipular los nombres de las provincias, pues los nombres de ambos ficheros no coinciden (omito este paso).

    df_spain <- merge(df_pol, df_pob, by.x = 'NAME_2', by.y = 'Provincia', all.x = TRUE)
    
  7. Paleta de colores y etiquetas
  8. Creamos una paleta dividiendo la población en 5 intervalos.

    # Paleta
    bins <-  quantile(df_spain$Población, probs = c(0, 0.2, 0.4, 0.6, 0.8, 1))) 
    pal <- colorBin("YlOrRd", domain = ~ Población, bins = bins)
    # Etiquetas
    labels <- sprintf(
      "<strong>%s</strong><br/>%s Habitantes",
      df_spain@data$NAME_2,
      format(
        df_spain@data$Población,
        big.mark = ".",
        decimal.mark = ","
      )
    ) %>% lapply(htmltools::HTML)
    
  9. Creamos el mapa
  10. Añadimos todos los elementos al mapa. Centramos el mapa, añadimos el color de la paleta en función de la población, controlamos la opacidad, y finalmente añadimos la leyenda.

    
    m <- leaflet(df_spain) %>%
      setView(lng = -3.7, lat = 40.4, zoom = 06) %>%
      addTiles() %>%
      addPolygons(fillColor = ~pal(Población),
                  weight = 2,
                  opacity = 0.2,
                  color = "#FD8D3C",
                  dashArray = "3",
                  fillOpacity = 0.6,
                  highlight = highlightOptions(
                    weight = 5,
                    color = "#666",
                    dashArray = "",
                    fillOpacity = 1,
                    bringToFront = TRUE),
                  label = labels,
                  labelOptions = labelOptions(
                    style = list("font-weight" = "normal", padding = "3px 8px"),
                    textsize = "15px",
                    direction = "auto"))  %>% 
      addLegend(pal = pal,values =  ~ Población,
                position = "bottomright",
                opacity = 1,
                title = "Población")
    m
    

Entradas relacionadas

No hay comentarios:

Publicar un comentario

Nube de datos