Introducción

Si no sabes que es Highcharter, puedes revisar nuestro post: Gráficos dinámicos con highcharter

Si ya lo conoces pasemos directamente a una aplicación de la función hcmap.

Mapas dinámicos - Función hcmap

La función hcmap nos permite crear mapas dinámicos de forma muy fácil, únicamente debemos seleccionar un mapa (url) de la colección highmaps y usarlo con nuestros datos y personalización deseada.

La función se encarga de descargar el mapa (tipo lista) y genera el gráfico.

library(highcharter)
## Highcharts (www.highcharts.com) is a Highsoft software product which is
## not free for commercial and Governmental use
hcmap("countries/ec/ec-all")

Una vez tenemos el gráfico debemos agregarle nuestros datos, para esto vamos a usar un dataframe que contenga una variable identificadora (provincia, estado, departamento, etc.) y la variable cuantitativa deseada, para evitar errores e ingresar manualmente los nombres de las provincias, estados o departamentos usamos la función get_data_from_map() de la siguiente forma:

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
mapdata <- get_data_from_map(download_map_data("countries/ec/ec-all"))
glimpse(mapdata)
## Observations: 25
## Variables: 19
## $ hc-group    <chr> "admin1", "admin1", "admin1", "admin1", "admin1", ...
## $ hc-middle-x <dbl> 0.44, 0.60, 0.64, 0.62, 0.58, 0.56, 0.40, 0.35, 0....
## $ hc-middle-y <dbl> 0.45, 0.47, 0.63, 0.66, 0.54, 0.61, 0.52, 0.47, 0....
## $ hc-key      <chr> "ec-gu", "ec-es", "ec-cr", "ec-im", "ec-su", "ec-s...
## $ hc-a2       <chr> "GU", "ES", "CR", "IM", "SU", "SE", "SD", "AZ", "E...
## $ labelrank   <chr> "7", "7", "7", "7", "7", "7", "7", "7", "7", "7", ...
## $ hasc        <chr> "EC.GU", "EC.ES", "EC.CR", "EC.IM", "EC.SU", "EC.S...
## $ woe-id      <chr> "2345211", "2345210", "2345206", "2345212", "23452...
## $ fips        <chr> "EC10", "EC09", "EC05", "EC11", "EC22", "EC25", "E...
## $ postal-code <chr> "GU", "ES", "CR", "IM", "SU", "SE", "SD", "AZ", "E...
## $ name        <chr> "Guayas", "Esmeraldas", "Carchi", "Imbabura", "Suc...
## $ country     <chr> "Ecuador", "Ecuador", "Ecuador", "Ecuador", "Ecuad...
## $ type-en     <chr> "Province", "Province", "Province", "Province", "P...
## $ longitude   <chr> "-79.8608", "-78.9448", "-78.0243", "-78.412400000...
## $ woe-name    <chr> "Guayas", "Esmeraldas", "Carchi", "Imbabura", "Suc...
## $ latitude    <chr> "-1.98384", "1.29253", "0.686611", "0.55271", "-0....
## $ woe-label   <chr> "Guayas, EC, Ecuador", "Esmeraldas, EC, Ecuador", ...
## $ type        <chr> "Provincia", "Provincia", "Provincia", "Provincia"...
## $ alt-name    <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...

Creamos el dataframe con la variable deseada, debemos tomar la variable hc-a2 como variable identificadora.

data_ecuador <- mapdata %>% 
  select(PROVINCIA = `hc-a2`) %>% 
  mutate(X = 1:25)
glimpse(data_ecuador)
## Observations: 25
## Variables: 2
## $ PROVINCIA <chr> "GU", "ES", "CR", "IM", "SU", "SE", "SD", "AZ", "EO"...
## $ X         <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 1...

Finalmente generamos el mapa con la función hcmap de la sgiuiente forma:

hcmap("countries/ec/ec-all", data = data_ecuador, value = "X",
      joinBy = c("hc-a2", "PROVINCIA"),
      dataLabels = list(enabled = TRUE, format = '{point.name}')) 

Podemos agregar mas detalles agregando argumentos borderColor, borderWidth, tooltip, etc. y mas funciones propias de highcharter.

hcmap("countries/ec/ec-all", data = data_ecuador, value = "X",
      joinBy = c("hc-a2", "PROVINCIA"),
      dataLabels = list(enabled = TRUE, format = '{point.name}'),
      borderColor = "#FAFAFA", borderWidth = 0.5,
      tooltip = list(valueDecimals = 2, valuePrefix = "$", valueSuffix = " USD")) %>%
        hc_mapNavigation(enabled = TRUE) %>%
        hc_title(text = "Mapa dinámico de Ecuador - R Users Group - Ecuador",
                 align = "center", style = list(color = "#000000", fontWeight = "bold"))

Pero vemos que el mapa es incorrecto, la provincia TUNGURAHUA del mapa en realidad es NAPO y TUNGURAHUA está en blanco. Esto es un error del mapa.

Pero no nos preocupemos, hemos corregido el mapa y lo cargamos en nuestro repositorio en Github.

Mapa Ecuador corregido

Dado que el mapa corregido lo vamos a bajar de nuestro repositorio debemos utilizar los paquetes rjson y stringr para descargar el mapa.

easypackages::libraries(c(“highcharter”, “dplyr”, “rjson”, “stringr”))

easypackages::libraries(c("rjson", "stringr"))
## Loading required package: rjson
## Loading required package: stringr
## All packages loaded successfully

Podemos descargar el mapa y usarlo localmente con:

    dir <- ifelse(Sys.info()[[1]]!="Linux", "C:/CRISBEN/", "/mnt/hgfs/CRISBEN/")
    ecuador <- fromJSON(file = paste0(dir,"APPS/VAE/BaseMapa/ec-all.geo.json"))

O podemos usarlo directamente con:

ecuador <- fromJSON(file = "https://raw.githubusercontent.com/Rusersgroup/mapa_ecuador/master/ec-all.geo.json")

Ahora grafiquemos el mapa de Ecuador con la población por provincia de acuerdo a los datos del Censo de Población de 2010 del INEC, los cuales hemos cargado previamente en nuestro repositorio y traemos directamente con:

load(url("https://raw.githubusercontent.com/Rusersgroup/mapa_ecuador/master/poblacion_provincia_ecuador_2010.Rdata"))
glimpse(poblacion_provincia_ecuador_2010)
## Observations: 24
## Variables: 2
## $ Provincia <fctr> Azuay, Cañar, Chimborazo, Cotopaxi, El Oro, Esmeral...
## $ Poblacion <dbl> 712127, 225184, 458581, 409205, 600659, 534092, 2512...

Grafiquemos el mapa de Ecuador con unos cuantos argumentos adicionales para personalizarlo:

highchart() %>%
        hc_title(text = "<i>Mapa dinámico de Ecuador</i> - <b>R Users Group - Ecuador</b>",
           margin = 20, align = "center",
           style = list(color = "#08338F", useHTML = TRUE)) %>% 
        hc_subtitle(text = "Población por provincia",
              align = "center",
              style = list(color = "#0C5C9E", fontWeight = "bold")) %>% 
        hc_tooltip(followPointer =  FALSE) %>%
        hc_add_series_map(ecuador, poblacion_provincia_ecuador_2010, name = "Población",
                          value = "Poblacion", joinBy = c("name", "Provincia"),
                          dataLabels = list(enabled = TRUE,
                                            format = '{point.properties.woe-name}')) %>%
        hc_colorAxis(minColor = "#B7D4EB", maxColor = "#08338F")  %>%
        hc_legend(align = "center", x = 0, y = -70) %>%
        hc_mapNavigation(enabled = TRUE) %>%
        hc_add_theme(hc_theme_ffx()) %>% 
        hc_add_annotation(xValue = 0, yValue = 0, title = list(text = 'Fuente: INEC')) %>% 
        hc_chart(borderColor = "#08338F",
           borderRadius = 10,
           borderWidth = 2)

Back to Top

Provincias de Ecuador

Ahora que hemos graficado Ecuador porque no hacerlo con sus provincias, para esto creamos una función que nos permite visualizar cada provincia.

Provincia <- as.character(poblacion_provincia_ecuador_2010$Provincia)
print(Provincia)
##  [1] "Azuay"                          "Cañar"                         
##  [3] "Chimborazo"                     "Cotopaxi"                      
##  [5] "El Oro"                         "Esmeraldas"                    
##  [7] "Galapagos"                      "Guayas"                        
##  [9] "Imbabura"                       "Loja"                          
## [11] "Los Rios"                       "Manabi"                        
## [13] "Morona Santiago"                "Napo"                          
## [15] "Orellana"                       "Pastaza"                       
## [17] "Pichincha"                      "Santa Elena"                   
## [19] "Santo Domingo De Los Tsachilas" "Sucumbios"                     
## [21] "Tungurahua"                     "Zamora Chinchipe"              
## [23] "Carchi"                         "Bolivar"
#n <- readline(prompt="Ingresar numero de provincia: ")
mapa_provincia <- function() {
        n <- round(runif(1,1,24))
        nombre_aux <- Provincia[as.numeric(n)]
        print(nombre_aux)
        
        # para carga local
        # dir <- ifelse(Sys.info()[[1]]!="Linux", "C:/CRISBEN/", "/mnt/hgfs/CRISBEN/")
        # provincia <- fromJSON(file = paste0(dir,"APPS/VAE/BaseMapa/Provincias/",nombre_aux,".geo.json"))
        
        provincia <- fromJSON(file = paste0("https://raw.githubusercontent.com/Rusersgroup/mapa_ecuador/master/Provincias/", nombre_aux, ".geo.json"))
        prov_data <- data.frame(Provincia=nombre_aux, Total=nchar(nombre_aux))
        
        highchart(type = "map") %>%
                hc_tooltip(followPointer =  FALSE) %>%
                hc_add_series_map(provincia, prov_data, name = "Total Procedimientos",
                                  value = "Total", joinBy = c("name", "Provincia"),
                                  dataLabels = list(enabled = TRUE,
                                                    format = '{point.properties.name}')) %>%
                hc_legend(enabled=FALSE) %>%
                hc_mapNavigation(enabled = TRUE) %>%
                hc_add_theme(hc_theme_sandsignika())
}
mapa_provincia()
## [1] "Chimborazo"
mapa_provincia()
## [1] "Esmeraldas"
mapa_provincia()
## [1] "Loja"
mapa_provincia()
## [1] "Pastaza"

Back to Top