Un cartograma es un tipo de mapa donde diferentes áreas geográficas son modificadas en base a una variable asociada a esas áreas. Aunque los cartogramas pueden ser visualmente atractivos, requieren un conocimiento previo de la geografía representada, ya que los tamaños y los límites de las geografías son alterados.
Usaremos los datos incluidos en el paquete mapSpain
, que proporciona datos de mapas en formato sf
y un conjunto de datos de muestra llamado pobmun19
, que incluye la población de España por municipio en 2019.
En primer lugar, necesitamos obtener los datos espaciales que contienen la información geográfica a ser usada en el gráfico. Usando el paquete mapSpain
podemos seleccionar las provincias, que son el segundo nivel de división administrativa del país, y visualizar el objeto con geom_sf
.
# install.packages("sf")
library(sf)
# install.packages("dplyr")
library(dplyr)
# install.packages("ggplot2")
library(ggplot2)
# install.packages("mapSpain")
library(mapSpain)
# install.packages("cartogram")
library(cartogram)
# Datos
prov <- esp_get_prov() %>%
mutate(name = prov.shortname.en) %>%
select(name, cpro)
# Mapa base
ggplot(prov) +
geom_sf()
Vamos a usar el paquete cartogram
, que es específico para esta tarea. Dado que cartogram
requiere un objeto sf
proyectado, vamos a proyectar nuestro mapa en la conocida proyección Mercator (EPSG code: 3857).
# Cambiar el CRS
prov_3857 <- st_transform(prov, 3857)
ggplot(prov_3857) +
geom_sf()
Para crear un cartograma tendremos que unir los datos estadísticos con los geográficos. Para ello, dado que los objetos sf
se comportan como data frames, podemos usar la función left_join
de dplyr
. Como el conjunto de datos pobmun19
proporciona datos a nivel municipal, primero tenemos que agregarlos a nivel provincial:
# Agregar
pob_provincias <- mapSpain::pobmun19 %>%
group_by(cpro) %>%
summarise(n_pop = sum(pob19))
prov_3857_datos <- prov_3857 %>%
left_join(pob_provincias, by = c("cpro"))
Después de unir los conjuntos de datos tendremos un objeto con los datos de mapSpain::pobmun19
junto con una columna llamada geometry
, que incluye los datos de las coordenadas geográficas.
Como resultado del proceso anterior, tenemos un objeto sf
con los datos estadísticos a ser dibujados. Podemos proceder ahora a crear un cartograma contiguo con ggplot2
, cartogram
y sf
, usando el objeto sf
modificado y pasando la variable de interés (columna n_pop
) al argumento weight
de la función cartogram_cont
:
Cartograma contiguo
prov_3857_datos_cartog_cont <-
cartogram_cont(prov_3857_datos,
weight = "n_pop")
ggplot(prov_3857_datos_cartog_cont) +
geom_sf()
Colores por defecto
Si pasas la variable de interés al argumento fill
de aes
puedes colorear las regiones por color en base a esa variable.
ggplot(prov_3857_datos_cartog_cont) +
geom_sf(aes(fill = n_pop))
Personalización de los colores
Ten en cuenta que puedes especificar una paleta de colores personalizada utilizando scale_fill_gradientn
o una función equivalente y cambiar los colores de los bordes con el argumento color
de la función geom_sf
.
ggplot(prov_3857_datos_cartog_cont) +
geom_sf(aes(fill = n_pop), color = "gray30") +
scale_fill_gradientn(colours = heat.colors(n = 10,
alpha = 0.5,
rev = TRUE))
Por último, podemos crear un cartograma avanzado mejorando la leyenda con una función de etiquetado y modificando algunos componentes del tema y la leyenda.
# Función de etiquetado
label_fun <- function(breaks) {
labels <- breaks / 1000000
return(labels)
}
ggplot(prov_3857_datos_cartog_cont) +
geom_sf(aes(fill = n_pop), color = "gray30") +
scale_fill_gradientn(
colours = hcl.colors(3, "GnBu", rev = TRUE),
labels = label_fun,
n.breaks = 15,
guide = guide_colorsteps(
barwidth = 15,
barheight = 0.5,
title = "millones",
title.position = "right",
title.vjust = 0.1)) +
theme_void() +
theme(legend.position = "top",
legend.margin = margin(t = 10, b = 2),
legend.title = element_text(size = 7),
legend.text = element_text(angle = 45,
margin = margin(t = 5))) +
labs(title = "España: Población por provincia",
subtitle = "(censo 2019)")
Hasta ahora, el tipo de cartograma producido ha sido un cartograma contiguo, donde las geografías se deforman mientras que se mantienen los límites adyacentes. Sin embargo, existen otras clases de cartogramas que se pueden crear con el paquete cartogram
.
Este tipo de cartogramas reduce o incrementa las geografías en base a un valor dado. Si bien no hay deformación de la geometría de la geografía, los tamaños se modifican dejando espacios entre ellos.
Para crear un cartograma no contiguo puedes transformar el conjunto de datos prov_3857_datos
haciendo uso de la función cartogram_ncont
y pasando la variable de interés (columna n_pop
) al argumento weight
.
prov_3857_datos_cartog_ncont <-
cartogram_ncont(prov_3857_datos,
weight = "n_pop")
ggplot(prov_3857_datos_cartog_ncont) +
geom_sf()
De manera similar al cartograma avanzado de la sección anterior, si quieres crear un cartograma no contiguo más atractivo puedes personalizar la leyenda, el tema y otros componentes estéticos.
ggplot(prov_3857_datos_cartog_ncont) +
geom_sf(aes(fill = n_pop), color = "gray30") +
scale_fill_gradientn(
colours = hcl.colors(n = 3, "ag_Sunset", rev = TRUE),
labels = label_fun,
n.breaks = 15,
guide = guide_colorsteps(
barwidth = 15,
barheight = 0.5,
title = "millones",
title.position = "right",
title.vjust = 0.1)) +
theme_void() +
theme(legend.position = "top",
legend.margin = margin(t = 10, b = 2),
legend.title = element_text(size = 7),
legend.text = element_text(angle = 45,
margin = margin(t = 5))) +
labs(title = "España: Población por provincia",
subtitle = "(censo 2019)")
Este tipo de cartograma sustituye la geografía original con un símbolo (por lo general un círculo) con su tamaño reducido o incrementado en base al valor a ser representado:
Por defecto
Para crear un cartograma de Dorling en ggplot2 pasa el conjunto de datos prov_3857_datos
a la función cartogram_dorling
y pasa el nombre de la variable de interés al argumento weight
.
prov_3857_datos_cartog_dorling <-
cartogram_dorling(prov_3857_datos,
weight = "n_pop")
ggplot(prov_3857_datos_cartog_dorling) +
geom_sf()
Cartograma de Dorling avanzado
ggplot(prov_3857_datos_cartog_dorling) +
geom_sf(aes(fill = n_pop), color = "grey50") +
scale_fill_gradientn(
colours = hcl.colors(3, "Zissou 1", rev = TRUE),
labels = label_fun,
n.breaks = 15,
guide = guide_colorsteps(
barwidth = 15,
barheight = 0.5,
title = "millones",
title.position = "right",
title.vjust = 0.1)) +
theme_void() +
theme(legend.position = "top",
legend.margin = margin(t = 10, b = 2),
legend.title = element_text(size = 7),
legend.text = element_text(angle = 45,
margin = margin(t = 5))) +
labs(title = "España: Población por provincia",
subtitle = "(censo 2019)")
También te puede interesar