R que R

Maps: Mapas en R usando coordenadas geográficas

Thu, Oct 17, 2019
R Maps
#maps #mapdata #gganimate #mapas


Creación de Mapas utilizando paquetes de R


Para generar mapas en R podemos importar archivos tipo shapefile (SHP) donde se almacena la ubicación geométrica y diversa información de atributos de entidades geográficas. En otro post expondré cómo trabajar con dichos archivos, cómo importar archivos shapefile y cómo trabajar con ellos. No obstante, existen también diversos paquetes que podemos utilizar para realizar mapas en R y sobre ellos trabajaremos en este post. Por ejemplo, utilizando los paquetes {mapdata} y {ggplot2} podemos generar un mapa del mundo estableciendo la siguiente orden:



library(mapdata)
library(ggplot2)
library(maps)
library(ggrepel)

# Guardamos la información en un nuevo dataframe llamado mapa_mundo

mapa_mundo <- map_data("world")


# Para visualizar el mapa utilizamos geom_polygon() 

library(tidyverse)

mapa_mundo %>%
  ggplot() +
  geom_polygon(aes( x= long, y = lat, group = group),
               fill = "black",
               color = "white")


Además, el mapa anterior podemos customizarlo a nuestro gusto utilizando las operaciones clásicas del paquete {ggplot2}.



mapa_mundo %>%
  ggplot() +
  geom_polygon(aes( x= long, y = lat, group = group),
               fill = "grey80",
               color = "white") +
  theme_minimal() +
  theme(
    axis.line = element_blank(),
    axis.text = element_blank(),
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    panel.background = element_rect(colour= "black", size= 1)) +
  ggtitle( "Mapa Mundi") 


Asimismo, podemos generar mapas regionales indicando las coordenadas. Para realizar un mapa de España peninsular y Baleares, Portugal, sur de Francia y norte de África podemos indicar las siguientes coordenadas:



mapa_mundo %>%
  ggplot() +
  geom_polygon(aes( x= long, y = lat, group = group),
               fill = "grey80",
               color = "white") +
  theme_minimal() +
  theme(
    axis.line = element_blank(),
    axis.text = element_blank(),
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    panel.background = element_rect(colour= "black", size= 1)) +
  ggtitle( "Mapa de la Península Ibérica") +
  coord_fixed (xlim= c(-12,5),
              ylim= c(35,45),
              ratio = 1.3)


De forma similar podemos representar en un mapa, por ejemplo, la región de América del Sur y zonas colindantes indicando las coordenadas adecuadas:



mapa_mundo %>%
  ggplot() +
  geom_polygon(aes( x= long, y = lat, group = group),
               fill = "grey80",
               color = "white") +
  theme_minimal() +
  theme(
    axis.line = element_blank(),
    axis.text = element_blank(),
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    panel.background = element_rect(colour= "black", size= 1)) +
  ggtitle( "Mapa de América del Sur") +
  coord_fixed (xlim= c(-100,-25),
              ylim= c(-60,20),
              ratio = 1.2)


Podemos identificar el nombre de algunas ciudades de las siguiente forma:



ciudades <- c("Lima", "Sao Paulo", "Bogotá")
coordenadas <- data.frame( long = c(-77.0282364, -46.6388, -74.081749 ), 
                           lat= c(-12.0431805,-23.5489, 4.6097102),
                           stringsAsFactors = F) 
              
coordenadas$ciudades <- ciudades      



mapa_mundo %>%
  ggplot() +
  geom_polygon(aes( x= long, y = lat, group = group),
               fill = "grey80",
               color = "white") +
  theme_minimal() +
  theme(
    axis.line = element_blank(),
    axis.text = element_blank(),
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    panel.background = element_rect(colour= "black", size= 1)) +
  ggtitle( "Mapa de América del Sur") +
  coord_fixed (xlim= c(-100,-25),
              ylim= c(-60,20),
              ratio = 1.2)+
  geom_point(data=coordenadas, aes(long, lat),
             color= "red", size=1) +
  geom_text_repel(data = coordenadas, 
                  aes(long, lat, label =ciudades))


Existe también un theme, usando la función theme_map() del paquete {ggthemes}, diseñado para representar mapas visualmente bastante agradables.



library(ggthemes)

ggplot() +
  borders("world", colour = "white", fill = "brown") +
  theme_map()


Visualización de mapas utilizando coordenadas geográficas


Para realizar este apartado vamos a utilizar el dataframe meteorites del proyecto Tidytuesday. Este dataset, que se ha construido con datos de The Meteoritical Society, incluye los meteoritos que han caído en la tierra y los que se han encontrado así como información de los mismos (nombre, id, tipo, class, masa, año encontrado, latitud, longitud y geolocalización).


En primer lugar descargamos el archivo .csv directamente del github de tidytuesday de la siguiente forma:



meteoritos <- readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-06-11/meteorites.csv")
## Parsed with column specification:
## cols(
##   name = col_character(),
##   id = col_double(),
##   name_type = col_character(),
##   class = col_character(),
##   mass = col_double(),
##   fall = col_character(),
##   year = col_double(),
##   lat = col_double(),
##   long = col_double(),
##   geolocation = col_character()
## )

# Quitamos los elementos que faltan (na´s) para la representación gráfica

meteoritos_mapa <- meteoritos %>%
  drop_na()

 

En primer lugar vamos a representar todos los meteoritos en el mapa del mundo, tanto los que se han detectado al caer (fell) como los encontrados (found). Para ello utilizaremos el theme theme_map() visto en el punto anterior y añadiremos un geom_point() con información de los meteoritos.



options(scipen = 999) # para evitar la anotación científica 

# Graficamos indicando 

mapa_mundo %>%
  ggplot() +
  geom_polygon(aes( x= long, y = lat, group = group),
               fill = "grey80",
               color = "white") +
  geom_point(data= meteoritos_mapa, 
             aes(x=long, y = lat, size = mass/1000), 
             stroke = F) +
  scale_size_continuous(name = "Kg") +
  ggtitle( "Meteoritos") +
  theme_map()

 

Existe como vemos una gran diferencia de tamaño entre los meteoritos incluidos en el dataframe. Veamos, por curiosidad, cuales son los meteoritos de más de 30mil kilos:



meteoritos %>%
  select(name, year, mass, fall) %>%
  filter( mass > 30000000) %>%
  arrange(desc(mass))
## # A tibble: 3 x 4
##   name             year     mass fall 
##   <chr>           <dbl>    <dbl> <chr>
## 1 Hoba             1920 60000000 Found
## 2 Cape York        1818 58200000 Found
## 3 Campo del Cielo  1575 50000000 Found


Hoba, Cape York y Campo del Cielo, meteoritos encontrados en Namibia, Groenlandia y Argentina respectivamente, son los meteoritos de mayor masa. Se puede ver una foto de ellos en el siguiente enlace.


Para diferenciar los meteoritos caídos (fell) y los encontrados (found) podemos asociar a cada uno de ellos un color de la siguiente forma:



mapa_mundo %>%
  ggplot() +
  geom_polygon(aes( x= long, y = lat, group = group),
               fill = "grey80",
               color = "white") +
  geom_point(data= meteoritos_mapa, 
             aes(x=long, y = lat, size = mass/1000, color = fall), 
             stroke = F) +
  scale_color_manual(values = c( "black", "orange"), name = " ") + 
  scale_size_continuous(name = "Kg") +
  ggtitle( "Meteoritos caídos y encontrados") +
  theme_map()


Para visualizar los meteoritos en una región determinada del globo debemos indicar las coordenadas tal y como se expuso previamente. Pongamos por ejemplo que nos interesa visualizar los meteoritos caídos (fell) en Europa, para ello podemos indicar los siguientes comandos:



# seleccionamos los meteoritos que nos interesa graficar

meteoritos_Europa <- meteoritos %>%
  filter(fall == "Fell") %>%
  drop_na() %>%
  filter(between(long, -12, 25),
         between(lat, 35, 65)) %>%
  arrange(mass)


# graficamos en un mapa de Europa (y escogemos un fondo oscuro)

mapa_mundo %>%
  ggplot() + 
  geom_polygon(aes(x=long, y=lat, group=group),
               fill= "grey30", color="white") +
  geom_point(data=meteoritos_Europa, aes(x=long, 
                                         y=lat, 
                                         size= mass/1000, 
                                         color= mass/1000), stroke=F) +
  coord_fixed(xlim= c(-12,25),
              ylim= c(35,65),
              ratio= 1.3)+
  ggtitle("Caída de meteoritos en Europa") +
  scale_size_continuous(name = "kg") +
  scale_color_gradient(low= "orange", high= "brown", name= "Kg") +
  guides(color= guide_legend()) +
  theme_classic() +
  theme(
    axis.line = element_blank(),
    axis.text = element_blank(),
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    panel.background = element_rect(colour= "grey30", size= 1, fill= NA)
  )