Un mapa de símbolos proporcionales es un tipo de mapa que usa símbolos para representar datos asociados a una región geográfica específica. Por lo general, el símbolo utilizado es un punto cuyo tamaño varía en relación a los datos subyacentes a ser representados. Este tipo de mapa también se conoce como mapa de burbujas o bubble map.

Usaremos los datos incluidos en el paquete giscoR, que proporciona datos de mapas en formato sf para representar el número de aeropuertos pertenecientes a cada país de la Unión Europea.

Extracción de los datos

En primer lugar, necesitaremos obtener los datos espaciales que contienen la información geográfica a ser usada en el mapa. Utilizando el paquete giscoR, podemos seleccionar los países de la Unión Europea y sus aeropuertos. También obtendremos la localización de los símbolos usando el centroide de los países, que pueden obtenerse con la función st_centroid().

Ten en cuenta que cuando se trabaja con datos espaciales todas las formas deberían presentar el mismo Sistema de Coordenadas de Referencia (CRS, por sus siglas en inglés). En este ejemplo seleccionamos ETRS89-extended / LAEA Europe (EPSG code: 3035) como el CRS a ser usado en nuestro mapa.

# install.packages("sf")
# install.packages("dplyr")
# install.packages("ggplot2")
# install.packages("giscoR")

library(giscoR)
library(dplyr)
library(sf)
library(ggplot2)

epsg_code <- 3035

# Países de la Unión Europea
EU_paises <- gisco_get_countries(region = "EU") %>%
  st_transform(epsg_code)

# Centroides de los países
pos_simbolos <- st_centroid(EU_paises, of_largest_polygon = TRUE)

# Aeropuertos de los países
aeropuertos <- gisco_get_airports(country = EU_paises$ISO3_CODE) %>%
  st_transform(epsg_code)

Podemos crear un gráfico de manera rápida para obtener una primera previsualización de nuestros datos:

# Gráfico
ggplot(EU_paises) +
  geom_sf() +
  xlim(c(2200000, 7150000)) +
  ylim(c(1380000, 5500000)) +
  # Aeropuertos
  geom_sf(data = aeropuertos,
          pch = 3,
          cex = 1,
          color = "red") +
  # Posición de las etiquetas (centroides)
  geom_sf(data = pos_simbolos, color = "blue")

Mapa de la Unión Europea con centroides y aeropuertos en ggplot2

Los aeropuertos están marcados en rojo mientras que la posición deseada para los símbolos proporcionales se representan en azul.

Manipulación de datos

El siguiente paso es contabilizar el número de aeropuertos por país y asociarlo al objeto pos_simbolos. Para ello, vamos a extraer el data frame de aeropuertos usando st_drop_geometry():

numero_aeropuertos <- aeropuertos %>%
  st_drop_geometry() %>%
  group_by(CNTR_CODE) %>%
  summarise(n = n())

Ahora podemos unir el conjunto de datos agregado a pos_simbolos:

labels_n <-
  pos_simbolos %>%
  left_join(numero_aeropuertos,
            by = c("CNTR_ID" = "CNTR_CODE")) %>%
  arrange(desc(n))

Dado que los puntos se dibujarán en orden, es una buena práctica ordenar las filas del objeto espacial en orden descendiente, es decir, de mayor a menor valor. Haciendo esto, los puntos pequeños se dibujarán encima de los grandes, de modo que ningún punto quedará oculto por los símbolos más grandes.

Mapa de símbolos proporcionales básico

Una vez realizados los pasos previos podemos crear el gráfico. Vamos a agregar los símbolos proporcionales sobre el mapa para tener una referencia espacial:

ggplot() +
  geom_sf(data = EU_paises, fill = "grey40") +
  geom_sf(data = labels_n,
          pch = 21,
          aes(size = n),
          fill = alpha("red", 0.7),
          col = "grey20") +
  xlim(c(2200000, 7150000)) +
  ylim(c(1380000, 5500000)) +
  labs(size = "Nº aeropuertos") +
  scale_size(range = c(1, 9))

Mapa de símbolos proporcionaes en R con ggplot2

Mapa de símbolos proporcionales avanzado

También podemos combinar un mapa de coropletas y un mapa de símbolos proporcionales para crear un mapa más avanzado:

Proportional symbol map in ggplot2 combined with a choropleth map

# Bubble choropleth map
ggplot() +
  geom_sf(data = EU_paises, fill = "grey95") +
  geom_sf(
    data = labels_n,
    pch = 21,
    aes(size = n, fill = n),
    col = "grey20") +
  xlim(c(2200000, 7150000)) +
  ylim(c(1380000, 5500000)) +
  scale_size(
    range = c(1, 9),
    guide = guide_legend(
      direction = "horizontal",
      nrow = 1,
      label.position = "bottom")) +
  scale_fill_gradientn(colours = hcl.colors(5, "RdBu",
                                            rev = TRUE,
                                            alpha = 0.9)) +
  guides(fill = guide_legend(title = "")) +
  labs(title = "Aeropuertos por país (2013)",
       sub = "Unión Europea",
       caption = "© EuroGeographics para los límites administrativos",
       size = "") +
  theme_void() +
  theme(legend.position = "bottom")

También te puede interesar