¿Cómo incorporar más de una geometría a un mapa?

En primer lugar se cargan las librerías.

library(tidyverse)
library(sf)

Nos interesa evaluar la oferta de turismo a partir de la densidad de agencias de viajes en los barrios de la Ciudad Autónoma de Buenos Aires, y la accesibilidad a dichos barrios. Las bases de datos con las que vamos a trabajar se encuentran disponibles aquí.

 

En primer lugar, vamos a cargar los barrios.

barrios <- read_sf("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/barrios/barrios.geojson")

¿Qué contiene el dataset?

head(barrios)
## Simple feature collection with 6 features and 4 fields
## geometry type:  POLYGON
## dimension:      XY
## bbox:           xmin: -58.50617 ymin: -34.63064 xmax: -58.41192 ymax: -34.57829
## geographic CRS: WGS 84
## # A tibble: 6 x 5
##   barrio     comuna perimetro    area                                   geometry
##   <chr>       <int>     <dbl>   <dbl>                              <POLYGON [°]>
## 1 CHACARITA      15     7725.  3.12e6 ((-58.45282 -34.59599, -58.45366 -34.5965…
## 2 PATERNAL       15     7088.  2.23e6 ((-58.46558 -34.59656, -58.46562 -34.5967…
## 3 VILLA CRE…     15     8132.  3.62e6 ((-58.42375 -34.59783, -58.42495 -34.5978…
## 4 VILLA DEL…     11     7705.  3.40e6 ((-58.49461 -34.61487, -58.49479 -34.6150…
## 5 ALMAGRO         5     8538.  4.05e6 ((-58.41287 -34.61412, -58.41282 -34.6154…
## 6 CABALLITO       6    10991.  6.85e6 ((-58.43061 -34.60705, -58.43056 -34.6077…

Realicemos un mapa. Como barrios tiene formato espacial, vamos a utilizar la función geom_sf() dentro de ggplot.

ggplot() +
  geom_sf(data = barrios) + 
  labs(title = "Barrios de la Ciudad Autónoma de Buenos Aires") + 
  theme_minimal() 

Ahora vamos a cargar los datos de agencias de viajes.

agencias <- read.csv("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/ente-de-turismo/agencias-viajes/agencias-de-viajes-y-turismo.csv")

¿Qué contiene el dataset?

head(agencias)
##    id                                      nombre id_usig periodo
## 1 254 Share Argentina Empresa de Viajes y Turismo     254    2021
## 2 253                  Les Amis Viajes Tribunales     253    2021
## 3 252                    Les Amis Viajes Recoleta     252    2021
## 4 251                   Les Amis Viajes Catalinas     251    2021
## 5 250            Les Amis Viajes Plaza San Martin     250    2021
## 6 249                    Les Amis Viajes Belgrano     249    2021
##                                 domicilio            telefono
## 1 Av. Córdoba 875 – Piso 12 – Oficina “E”     (011) 4894-4004
## 2                             Cerrito 844   (54-11) 5238-1690
## 3                      Vicente López 1621   (54-11) 5246-9600
## 4                    Leandro N Alem 1036  (54-11) 5246-6670  
## 5                        Av. Santa Fe 816   (54-11) 5246-6620
## 6                           La Pampa 2525   (54-11) 5246-6610
##                         email                            web
## 1 info@shareargentina.com.ar  http://shareargentina.com.ar/ 
## 2      cerrito@lesamis.com.ar      http://lesamisviajes.com/
## 3     recoleta@lesamis.com.ar      http://lesamisviajes.com/
## 4          cat@lesamis.com.ar      http://lesamisviajes.com/
## 5      santafe@lesamis.com.ar      http://lesamisviajes.com/
## 6     belgrano@lesamis.com.ar      http://lesamisviajes.com/
##                             funciones          calle altura
## 1                  Agencias de viajes        Córdoba    875
## 2 Agencias de viajes,Operadores de vi        Cerrito    844
## 3 Agencias de viajes,Operadores de vi  Vicente López   1621
## 4 Agencias de viajes,Operadores de vi Leandro N Alem   1036
## 5 Agencias de viajes,Operadores de vi       Santa Fe    816
## 6 Agencias de viajes,Operadores de vi       La Pampa   2525
##                   direccion   barrio    comuna      Long       Lat
## 1           CORDOBA AV. 875   Retiro  Comuna 1 -58.37935 -34.59887
## 2               CERRITO 844   Retiro  Comuna 1 -58.38263 -34.59858
## 3       LOPEZ, VICENTE 1621 Recoleta  Comuna 2 -58.38914 -34.59232
## 4 ALEM, LEANDRO N. AV. 1036   Retiro  Comuna 1 -58.37283 -34.59553
## 5          SANTA FE AV. 816   Retiro  Comuna 1 -58.37876 -34.59520
## 6             LA PAMPA 2525 Belgrano Comuna 13 -58.45547 -34.56553

Vamos a agrupar los datos por barrio, y vamos a modificar el formato de la variable barrio. Para que pueda unirse con nuestras geometrías, necesitamos que estén escritos en mayúscula.

agenciasxbarrio <- agencias %>% 
  group_by(barrio) %>% 
  summarise(cantidad = n()) %>% 
  mutate(barrio = toupper(barrio))
## `summarise()` ungrouping output (override with `.groups` argument)
agenciasxbarrio
## # A tibble: 15 x 2
##    barrio           cantidad
##    <chr>               <int>
##  1 BALVANERA               8
##  2 BELGRANO                3
##  3 COLEGIALES              2
##  4 MONSERRAT              10
##  5 MONTE CASTRO            1
##  6 PALERMO                 5
##  7 PARQUE PATRICIOS        1
##  8 PUERTO MADERO           2
##  9 RECOLETA                7
## 10 RETIRO                 66
## 11 SAN NICOLAS           143
## 12 VERSALLES               1
## 13 VILLA CRESPO            2
## 14 VILLA SANTA RITA        2
## 15 VILLA URQUIZA           1

A continuación, vamos a unir la cantidad de agencias por barrio a la geometría barrios.

barrios <- left_join(barrios, agenciasxbarrio, by = "barrio")

Verifiquemos que en nuestro dataset efectivamente estén los 15 barrios que tenían agencias.

barrios %>% 
  filter(!is.na(cantidad)) %>% 
  nrow()
## [1] 15

Ahora vamos a calcular la densidad de agencias de viaje por km2 (100 manzanas).

barrios <- barrios %>% 
  mutate(dens_agencias = round(cantidad/(area/1000000), digits = 3))

Realicemos ahora un mapa con esta información.

ggplot() +
  geom_sf(data = barrios, aes(fill = dens_agencias), size = 0.2) + 
  labs(title = "Barrios en CABA", 
       fill = "Densidad de \nAgencias de viaje") + 
  scale_fill_viridis_c(trans = "log2", na.value = "grey80") + 
  theme_minimal() +
  theme(legend.direction = "horizontal", 
        legend.position = "bottom", 
        legend.title=element_text(size=8), 
        legend.key.width = unit(2,"cm"))

Tenemos nuestro mapa. Ahora queremos incorporar las líneas de subte, ya que queremos ver si los barrios que tienen mayor densidad de agencias de viajes se encuentran además más servidos por transporte público.

 
Cargamos los datos de líneas y estaciones de subte.

lineas <- read_sf("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/subte-estaciones/subte_lineas.geojson")
estaciones <- read_sf("https://cdn.buenosaires.gob.ar/datosabiertos/datasets/subte-estaciones/subte_estaciones.geojson")
head(lineas)
## Simple feature collection with 6 features and 2 fields
## geometry type:  MULTILINESTRING
## dimension:      XY
## bbox:           xmin: -58.45649 ymin: -34.58516 xmax: -58.41596 ymax: -34.56231
## geographic CRS: WGS 84
## # A tibble: 6 x 3
##      ID LINEASUB                                                        geometry
##   <int> <chr>                                              <MULTILINESTRING [°]>
## 1     1 LINEA D  ((-58.45213 -34.56622, -58.45163 -34.56648, -58.44903 -34.5678…
## 2     2 LINEA D  ((-58.45649 -34.56231, -58.45528 -34.5637, -58.4543 -34.56488,…
## 3     3 LINEA D  ((-58.44467 -34.57001, -58.44252 -34.5711, -58.43844 -34.57335…
## 4     4 LINEA D  ((-58.43501 -34.57518, -58.43423 -34.57555, -58.43302 -34.5761…
## 5     5 LINEA D  ((-58.42571 -34.57842, -58.42539 -34.57858, -58.42378 -34.5796…
## 6     6 LINEA D  ((-58.4212 -34.58141, -58.42015 -34.58224, -58.41817 -34.58361…
head(estaciones)
## Simple feature collection with 6 features and 3 fields
## geometry type:  POINT
## dimension:      XY
## bbox:           xmin: -58.40604 ymin: -34.63575 xmax: -58.38057 ymax: -34.60425
## geographic CRS: WGS 84
## # A tibble: 6 x 4
##      ID ESTACION                   LINEA              geometry
##   <dbl> <chr>                      <chr>           <POINT [°]>
## 1     1 CASEROS                    H     (-58.39893 -34.63575)
## 2     2 INCLAN - MEZQUITA AL AHMAD H     (-58.40097 -34.62938)
## 3     3 HUMBERTO 1°                H     (-58.40232 -34.62309)
## 4     4 VENEZUELA                  H     (-58.40473 -34.61524)
## 5     5 ONCE - 30 DE DICIEMBRE     H     (-58.40604 -34.60894)
## 6     6 9 DE JULIO                 D     (-58.38057 -34.60425)

Vemos que las líneas no están escritas de la misma manera. Vamos a modificar eso.

estaciones <- estaciones %>% 
  mutate(LINEASUB = paste0("LINEA ", LINEA))

Ahora vamos a incorporar las líneas y estaciones de subte a nuestro mapa coroplético sobre densidad de agencias de viaje por barrios. ¿Cómo lo hacemos? Es muy fácil!  
Solo necesitamos incorporar más capas con geometrías utilizando la función geom_sf(). No olviden de aclarar cual es el dataset (con data =) que van a utilizar.

ggplot() +
  geom_sf(data = barrios, aes(fill = dens_agencias), size = 0.2, alpha = 0.89) + 
  labs(title = "OFERTA DE TURISMO EN MICROCENTRO", 
       subtitle  = "Según cantidad de agencias de viajes y accesibilidad" , 
       fill = "Densidad de \nAgencias de viaje", 
       color = "Subte") + 
  scale_fill_gradient(high = "black", low = "grey90", trans = "log2", na.value = "white") + 
  geom_sf(data = lineas, alpha = 0.6, linetype = "dashed", aes(color = LINEASUB)) +
  geom_sf(data = estaciones, alpha = 0.6,  aes(color = LINEASUB)) +
  scale_color_manual(values = c("cyan3", "red","blue3",  "forestgreen", "darkorchid3", "yellow" )) +
  theme_minimal() +
  theme(legend.title=element_text(size=8))

Podemos observar en la zona de Microcentro no solo hay mayor concentración de líneas de subte, sino que también hay mayor densidad de agencias de viaje.
 

Hagamos un zoom al microcentro.

ggplot() +
  geom_sf(data = barrios, aes(fill = dens_agencias), size = 0.2, alpha = 0.89) + 
  labs(title = "OFERTA DE TURISMO EN MICROCENTRO", 
       subtitle  = "Según cantidad de agencias de viajes y accesibilidad" , 
       fill = "Densidad de \nAgencias de viaje", 
       color = "Subte", 
       x = "", 
       y = "") + 
  scale_fill_gradient(high = "black", low = "grey90", trans = "log2", na.value = "white") + 
  geom_sf(data = lineas, alpha = 0.6, linetype = "dashed", aes(color = LINEASUB)) +
  geom_sf(data = estaciones, alpha = 0.6,  aes(color = LINEASUB)) +
  scale_color_manual(values = c("cyan3", "red","blue3",  "forestgreen", "darkorchid3", "yellow" )) +
  geom_sf_label(data = barrios, aes(label = barrio), size = 2, alpha = 0.7) +
  theme_minimal() +
  theme(legend.title=element_text(size=8)) + 
  coord_sf(xlim = c(-58.43, -58.37), ylim = c(-34.62, -34.57))