Mapas en ggplot2 con maps, geom_polygon y geom_map

Datos de un paquete

Existen varias formas de crear un mapa en R con ggplot2 dependiendo de tus datos de entrada. La manera más sencilla es importar un mapa a partir de algún paquete, como maps o rnaturalearth, pero en este tutorial nos vamos a centrar en el paquete maps. Para utilizar uno de sus mapas en ggplot2 tendremos que usar la función map_data de ggplot2, que convertirá el mapa en un data frame que ggplot2 pueda interpretar.

En el siguiente ejemplo cargamos el mapa mundial. Para dibujar el mapa podemos utilizar las funciones geom_polygon o geom_map tal y como se muestra a continuación.

# install.packages("ggplot2")
# install.packages("maps")
library(ggplot2)
library(maps)

# Importar los datos con coordenadas
world <- map_data("world")

# Creamos el mapa. group = group conecta los puntos en el orden correcto
ggplot(data = world, aes(x = long, y = lat, group = group)) + 
  geom_polygon() 

# Equivalente a
ggplot(world, aes(map_id = region)) +
  geom_map(data = world, map = world,
    aes(x = long, y = lat, map_id = region))

Mapa del mundo en ggplot2 con map_data

Dibujar datos espaciales con sf y geom_sf

Datos a partir de un shapefile o geojson

Probablemente, la mejor forma de crear un mapa es importando un shapefile (.shp) o un geojson, pero ello implica que tendrás que realizar una búsqueda para encontrar el mapa que quieres crear. Existen múltiples recursos para descargar mapas en diferentes formatos, como GISCO (revisa el paquete giscoR), opendatasoft o Efrain Maps, entre otros.

Para leer un geojson o un shapefile puedes utilizar la función read_sf de la librería sf. Luego, puedes pasar le objecto a ggplot2 y utilizar la función geom_sf, que permite visualizar lo que se conoce como objetos sf.

Mapas en ggplot2 con geom_sf

# install.packages("ggplot2")
# install.packages("sf")
library(ggplot2)
library(sf)

# Importamos un geojson o shapefile
mapa <- read_sf("https://raw.githubusercontent.com/R-CoderDotCom/data/main/ukraine.geojson")

ggplot(mapa) +
  geom_sf()

Puedes agregar más capas al mapa, como puntos u otras geometrías.

Sistemas de coordenadas

Puedes personalizar el sistema de coordenadas utilizado para representar un mapa en ggplot2. Si quieres comprobar qué sistema de coordenadas de referencia (CRS) tiene tu geometría puedes utilizar la función st_crs de sf.

# install.packages("sf")
library(sf)

# Importamos un geojson o shapefile
mapa <- read_sf("https://raw.githubusercontent.com/R-CoderDotCom/data/main/ukraine.geojson")

# Vemos el CRS
st_crs(mapa)

# Coordinate Reference System:
#   User input: WGS 84 
#   wkt:
# GEOGCRS["WGS 84",
#     DATUM["World Geodetic System 1984",
#         ELLIPSOID["WGS 84",6378137,298.257223563,
#             LENGTHUNIT["metre",1]]],
#     PRIMEM["Greenwich",0,
#         ANGLEUNIT["degree",0.0174532925199433]],
#     CS[ellipsoidal,2],
#         AXIS["geodetic latitude (Lat)",north,
#             ORDER[1],
#             ANGLEUNIT["degree",0.0174532925199433]],
#         AXIS["geodetic longitude (Lon)",east,
#             ORDER[2],
#             ANGLEUNIT["degree",0.0174532925199433]],
#     ID["EPSG",4326]]

Si quieres cambiar el sistema de coordenadas puedes utilizar directamente la función coord_sf. Esta función se asegura de que todas las capas tengan el mismo CRS y en caso de que no se especifique ninguna usará el CRS de la primera capa de geometría. También puedes utilizar el argumento crs para especificar un CRS personalizado, como en el ejemplo siguiente:

# install.packages("ggplot2")
# install.packages("sf")
library(ggplot2)
library(sf)

# Importamos un geojson o shapefile
mapa <- read_sf("https://raw.githubusercontent.com/R-CoderDotCom/data/main/ukraine.geojson")

ggplot(mapa) +
  geom_sf() +
  coord_sf(crs = "+proj=robin")

Cambiar el CRS de un mapa en ggplot2

Recuerda que también podrías utilizar la función st_transform de sf para cambiar el CRS de un objeto sf.

Colores

Color de fondo

Puedes cambiar el color de fondo del mapa pasando un color al argumento fill de geom_sf.

Color de fondo de un mapa de ggplot2

# install.packages("ggplot2")
# install.packages("sf")
library(ggplot2)
library(sf)

# Importamos un geojson o shapefile
mapa <- read_sf("https://raw.githubusercontent.com/R-CoderDotCom/data/main/ukraine.geojson")

ggplot(mapa) +
  geom_sf(fill = "white")

Color de borde

Si quieres personalizar el color de borde de las geometrías puedes utilizar el argumento color.

Color de borde de una geometría de un objeto sf

# install.packages("ggplot2")
# install.packages("sf")
library(ggplot2)
library(sf)

# Importamos un geojson o shapefile
mapa <- read_sf("https://raw.githubusercontent.com/R-CoderDotCom/data/main/ukraine.geojson")

ggplot(mapa) +
  geom_sf(color = "red")

Color en base a una variable numérica

Ten en cuenta que también puedes basar el color en una variable numérica que represente cierta característica de cada área geográfica representada. Para ello tendrás que pasar la variable al argumento fill dentro de aes. A este tipo de gráfico se le llama gráfico de coropletas.

Color de un mapa en base a una variable numérica en ggplot2

# install.packages("ggplot2")
# install.packages("sf")
library(ggplot2)
library(sf)

# Importamos un geojson o shapefile
mapa <- read_sf("https://raw.githubusercontent.com/R-CoderDotCom/data/main/shapefile_spain/spain.geojson")

ggplot(mapa) +
  geom_sf(color = "white", aes(fill = unemp_rate)) +
  theme(legend.position = "none")

Color en base a una variable categórica

En lugar de una variable numérica también puedes pasar una variable categórica que represente grupos. En el ejemplo siguiente pasamos los nombres de cada comunidad autónoma de España, de modo que cada comunidad se representará en un color diferente.

Color de las geometrías de un mapa en base a una variable categórica en ggplot2

# install.packages("ggplot2")
# install.packages("sf")
library(ggplot2)
library(sf)

# Importamos un geojson o shapefile
mapa <- read_sf("https://raw.githubusercontent.com/R-CoderDotCom/data/main/shapefile_spain/spain.geojson")

ggplot(mapa) +
  geom_sf(color = "white", aes(fill = name)) +
  theme(legend.position = "none")

Etiquetas

Es posible agregar etiquetas a las geometrías de un mapa hecho con ggplot2. Existen varias funciones que puedes utilizar, como geom_text y geom_label o geom_sf_text y geom_sf_label si estás trabajando con objetos sf o incluso las funciones geom_text_repel y geom_label_repel de ggrepel.

geom_sf_text y geom_sf_label

Estas funciones se pueden utilizar cuando trabajas con objetos sf. Tendrás que pasar la variable con los textos al argumento label dentro de aes. Ten en cuenta que también puedes personalizar otros estilos de los textos, como su tamaño o color.

# install.packages("ggplot2")
# install.packages("sf")
library(ggplot2)
library(sf)

# Importamos un geojson o shapefile
mapa <- read_sf("https://raw.githubusercontent.com/R-CoderDotCom/data/main/shapefile_spain/spain.geojson")

ggplot(mapa) +
  geom_sf(color = "white", aes(fill = unemp_rate)) +
  geom_sf_text(aes(label = name), size = 2) +
  theme(legend.position = "none")

Textos en un mapa hecho con ggplot2

# install.packages("ggplot2")
# install.packages("sf")
library(ggplot2)
library(sf)

# Importamos un geojson o shapefile
mapa <- read_sf("https://raw.githubusercontent.com/R-CoderDotCom/data/main/shapefile_spain/spain.geojson")

ggplot(mapa) +
  geom_sf(color = "white", aes(fill = unemp_rate)) +
  geom_sf_label(aes(label = name), size = 2) +
  theme(legend.position = "none")

Agregar etiquetas a un mapa hecho con ggplot2

Si tus textos se solapan puedes utilizar las funciones geom_text_repel o geom_label_repel del paquete ggrepel, que automáticamente intentarán ajustar las etiquetas. Si estás trabajando con objetos sf tendrás que especificar la geometría en geometry y establecer stat = "sf_coordinates" como en el ejemplo siguiente.

# install.packages("ggplot2")
# install.packages("sf")
# install.packages("ggrepel")
library(ggplot2)
library(sf)

# Importamos un geojson o shapefile
mapa <- read_sf("https://raw.githubusercontent.com/R-CoderDotCom/data/main/shapefile_spain/spain.geojson")

ggplot(mapa) +
  geom_sf(color = "white", aes(fill = unemp_rate)) +
  geom_text_repel(aes(label = name, geometry = geometry),
                  stat = "sf_coordinates", size = 3) +
  theme(legend.position = "none")

Evitar solapamiento de las etiquetas de un mapa de ggplot2

Mapas interactivos

Con la función ggplotly de plotly puedes convertir un mapa estático hecho con ggplot2 en un mapa interactivo. Para ello tan solo tienes que asignar un mapa a un objeto y luego aplicar la función ggplotly a ese objeto.