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))
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.
# 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.
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")
Recuerda que también podrías utilizar la función st_transform
de sf para cambiar el CRS de un objeto sf.
Color de fondo
Puedes cambiar el color de fondo del mapa pasando un color al argumento fill
de 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(fill = "white")
Color de borde
Si quieres personalizar el color de borde de las geometrías puedes utilizar el argumento 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/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.
# 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.
# 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")
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")
# 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")
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")
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.