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