Ajuste de la posición de las Islas Canarias en el mapa
Descripción
Es común ver al representar España en su totalidad como se desplazan las Islas Canarias para evitar el espacio vacío entre el archipiélago y el resto del territorio. Y aunque algunos paquetes como mapSpain
si nos proporcionan directamente la cartografía desplazada, cuando los datos provienen de fuentes externas con su cartografía ya presente, es necesario retocarlos manualmente, lo que retrasa la tarea. Por esta razón, este artículo presenta una función que permite mover el archipiélago, facilitando así una mejor visualización de la información.
Input
A modo de ejemplo, se utilizarán datos del catálogo de descargas del Ministerio para la Transición Ecológica y el Reto Demográfico. En la sección de datos demográficos de este sitio web, los usuarios pueden encontrar información sobre diversos indicadores demográficos, entre los cuales se incluye la densidad de población por municipio.
Ámbito: Nacional
Escala: 1:25.000
Actualización: 31/01/2024
Condiciones: Esta información se puede usar de modo libre y gratuito siempre que se mencione al Ministerio para la Transición Ecológica y el Reto Demográfico como autor y propietario de la información de la siguiente manera: Fuente: «© Ministerio para la Transición Ecológica y el Reto Demográfico».
Estos datos están disponibles en formato Shapefile.
Visualización
Cargamos las librerías necesarias:
Leemos el conjunto de datos:
data <- st_read("data/datap4/DensPob2023.shp")
Reading layer `DensPob2023' from data source
`C:\Users\Virgilio\OneDrive - Universitat de València\01 PROFESOR\06 Innovación Educativa\2023 2024\03 Web\datasets\data\datap4\DensPob2023.shp'
using driver `ESRI Shapefile'
Simple feature collection with 8131 features and 12 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -18.16118 ymin: 27.63772 xmax: 4.327785 ymax: 43.79238
Geodetic CRS: ETRS89
Se trata de un objeto sf
de 8131 observaciones y 13 variables.
class(data)
[1] "sf" "data.frame"
glimpse(data)
Rows: 8,131
Columns: 13
$ objectid <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, …
$ natcode <chr> "34053838046", "34053838047", "34053838048", "34053838049",…
$ nombre <chr> "Tegueste", "Tijarafe", "Valverde", "Valle Gran Rey", "Vall…
$ cod_nut1 <chr> "ES7", "ES7", "ES7", "ES7", "ES7", "ES7", "ES7", "ES7", "ES…
$ cod_nut2 <chr> "ES70", "ES70", "ES70", "ES70", "ES70", "ES70", "ES70", "ES…
$ cod_nut3 <chr> "ES709", "ES707", "ES703", "ES706", "ES706", "ES709", "ES70…
$ codmun_ine <chr> "38046", "38047", "38048", "38049", "38050", "38051", "3805…
$ ccaa <chr> "Canarias", "Canarias", "Canarias", "Canarias", "Canarias",…
$ cod_ccaa <chr> "05", "05", "05", "05", "05", "05", "05", "05", "05", "05",…
$ cod_pro <chr> "38", "38", "38", "38", "38", "38", "38", "38", "38", "35",…
$ provincia <chr> "Santa Cruz de Tenerife", "Santa Cruz de Tenerife", "Santa …
$ dens_pob <dbl> 428.969022, 49.300733, 49.814534, 146.515484, 27.040124, 51…
$ geometry <MULTIPOLYGON [°]> MULTIPOLYGON (((-16.32911 2..., MULTIPOLYGON (…
Lo visualizamos gráficamente con ggplot2
:
ggplot() +
geom_sf(data = data, aes(fill = log(dens_pob)), color = NA) +
scale_fill_gradientn(colors = c("white", "#cf2929", "darkred")) +
labs(title = "",
caption = "Fuente: «© Ministerio para la Transición Ecológica y el Reto Demográfico»",
x = "",
y = "") +
theme_void() +
theme(plot.caption = element_text(size = 25),
legend.position = "none")
Tratamiento
Se ha desarrollado una función llamada MoveCan
que, al recibir un data frame con la cartografía original de España, devuelve el mismo data frame con las Islas Canarias desplazadas a una posición que facilita la visualización de la información.
La función permite por un lado elegir entre colocar el archipiélago al sur-este o al sur-oeste de la península utilizando el argumento position
que por defecto toma el valor “left”. Por otro lado, también permite la opción de devolver una caja para separar denotar que las islas están desplazadas haciendo uso del argumento box
que por defecto está configurado como FALSE.
Internamente lo que hace es separar el data frame proporcionado en dos. Por un lado, las observaciones que contienen información de las Islas Canarias y por otro el resto. Posteriormente, extrae las coordenadas de las observaciones pertenecientes al archipiélago y las desplaza dependiendo de la opción elegida. Una vez finalizado el paso anterior, vuelve a unir los dos conjuntos y devuelve el nuevo data frame desplazado y apto para su visualización.
MoveCan <- function(data, var, value = "05", geometry = "geometry", position = "left", box = FALSE){
message("La función por defecto asume que la variable que permite dividir las Islas Canarias contiene el código de las CCAA, de no ser así deberá especificar el valor con el argumento **value**. Por otro lado, se asume que la columna con las cartografías se llama geometry. En caso de tener otro nombre use el argumento **geometry** para indicarlo.")
# data: data frame a transformar
# var: nombre de la variable que contenga el codigo de ccaa de canarias
# ("05") {char}. ej - codauto en mapSpain
# value: valor de var que representa canarias. Por defecto "05"
# geometry: contiene el nombre de la variable que contiene las geometrias
# {char}. Por defecto es igual a "geometry"
# position: c("left", "right"). Por defecto "left"
# box: por defecto FALSE
canarias <- data %>% filter(!!sym(var) == value)
geometrias <- st_geometry(canarias)
bbox <- data.frame()
if (position == "left"){
desplazamiento <- c(5, 7)
if (box == TRUE){
bbox <- st_linestring(rbind(c(-13.75, 36.65), c(-8.5, 36.65), c(-7.8, 36), c(-7.8, 34))) %>%
st_sfc() %>%
st_as_sf() %>%
st_set_crs(4258)
}
}
if (position == "right"){
desplazamiento <- c(18, 7)
if (box == TRUE){
bbox <- st_linestring(rbind(c(-0.55, 34.2), c(-0.55, 36), c(0.2, 36.65), c(5, 36.65))) %>%
st_sfc() %>%
st_as_sf() %>%
st_set_crs(4258)
}
}
canarias2 <- st_as_sf(geometrias + desplazamiento)
names(canarias2) <- "geometry"
canarias_def <- cbind(select(as.data.frame(canarias), -geometry), canarias2) %>%
st_as_sf() %>%
st_set_crs(4258)
esp_ncan <- data %>% filter(!!sym(var) != value)
esp <- rbind(esp_ncan, canarias_def) %>% arrange(var)
return(list(esp, bbox))
}
dens_pob1 <- MoveCan(data = data, var = "cod_ccaa")
La función por defecto asume que la variable que permite dividir las Islas Canarias contiene el código de las CCAA, de no ser así deberá especificar el valor con el argumento **value**. Por otro lado, se asume que la columna con las cartografías se llama geometry. En caso de tener otro nombre use el argumento **geometry** para indicarlo.
dens_pob2 <- MoveCan(data = data, var = "cod_ccaa", position = "right", box = TRUE)
La función por defecto asume que la variable que permite dividir las Islas Canarias contiene el código de las CCAA, de no ser así deberá especificar el valor con el argumento **value**. Por otro lado, se asume que la columna con las cartografías se llama geometry. En caso de tener otro nombre use el argumento **geometry** para indicarlo.
Output
En la siguiente figura se puede observar el nuevo mapa de España con las islas canarias desplazadas:
ggplot() +
geom_sf(data = dens_pob1[[1]], aes(fill = log(dens_pob)), color = NA) +
scale_fill_gradientn(colors = c("white", "#cf2929", "darkred")) +
labs(title = "",
caption = "Fuente: «© Ministerio para la Transición Ecológica y el Reto Demográfico»",
x = "",
y = "") +
theme_void() +
theme(plot.caption = element_text(size = 25),
legend.position = "none")
ggplot() +
geom_sf(data = dens_pob2[[1]], aes(fill = log(dens_pob)), color = NA) +
geom_sf(data = dens_pob2[[2]]) +
scale_fill_gradientn(colors = c("white", "#cf2929", "darkred")) +
labs(title = "",
caption = "Fuente: «© Ministerio para la Transición Ecológica y el Reto Demográfico»",
x = "",
y = "") +
theme_void() +
theme(plot.caption = element_text(size = 25),
legend.position = "none")
Proyecto de Innovación Educativa Emergente (PIEE-2737007)