Primer acercamiento a los datos espaciales: mapa coroplético sobre espacios verdes en CABA
¿A quién no le gustan esos hermosos y coloridos mapas coropléticos que circulan en Twitter?
En general, el 99% de mi uso de R es análisis estadístico: a veces tengo suerte y puedo dedicarle un poco más de tiempo a complementar ese análisis con algunos gráficos. Pero no trabajo con datos espaciales, entonces no tengo casi oportunidad para aprender este tipo de cosas.
Hoy tuve un rato libre y primero pensé en hacer algo de #TidyTuesday. Pero al mirar los datos (baños de aves en Australia), me di cuenta de que estaba orientado o bien a trabajar con variables categóricas o bien a trabajar con datos espaciales. Ya había practicando un poco con datos categoriales con los comandos de voz de Star Trek, así que eso lo descarté, pero hacer algo con datos espaciales me parecía un poco complejo.
Decidí entonces que era una buena oportunidad para empezar de a poco en ese tema y recordé la existencia de PolíticaArgentina, un universo de paquetes sobre Argentina. Por suerte, el readme
tenía un ejemplo de cómo hacer un gráfico con etiquetas, así que no fue difícil adaptarlo a algo nuevo.
Me quedé con el mapa de CABA, porque era lo que conocía, y planteé una pregunta que a cualquier porteño le importa: ¿hay suficientes espacios verdes en la Ciudad?
Una vez armado el gráfico, busqué información oficial sobre los espacios verdes en CABA, datos que por suerte encontré en el sitio oficial. Luego, fue cuestión de revisar el argumento de fill
y mejorar un poco el aspecto de las etiquetas. La verdad, quedé muy satisfecha: pensé que iba a ser mucho más difícil empezar, y sin embargo aquí estamos.
Aquí el código:
# Mapa coroplético de la cantidad de espacios verdes por metro cuadrado en CABA
# Choropleth map about green spaces in CABA
library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5 ✓ purrr 0.3.4
## ✓ tibble 3.1.4 ✓ dplyr 1.0.7
## ✓ tidyr 1.1.3 ✓ stringr 1.4.0.9000
## ✓ readr 2.0.1 ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
# devtools::install_github("politicaargentina/geoAr")
library(geoAr)
show_arg_codes()
## # A tibble: 26 × 5
## id codprov codprov_censo codprov_iso name_iso
## <chr> <chr> <chr> <chr> <chr>
## 1 ARGENTINA " " " " AR Argentina
## 2 CABA "01" "02" AR-C Ciudad Autónoma de Buenos Air…
## 3 BUENOS AIRES "02" "06" AR-B Buenos Aires
## 4 CATAMARCA "03" "10" AR-K Catamarca
## 5 CORDOBA "04" "14" AR-X Córdoba
## 6 CORRIENTES "05" "18" AR-W Corrientes
## 7 CHACO "06" "22" AR-H Chaco
## 8 CHUBUT "07" "26" AR-U Chubut
## 9 ENTRE RIOS "08" "30" AR-E Entre Ríos
## 10 FORMOSA "09" "34" AR-P Formosa
## # … with 16 more rows
(CABA <- get_geo(geo = "CABA"))
## Simple feature collection with 15 features and 2 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -58.52998 ymin: -34.70617 xmax: -58.33444 ymax: -34.53144
## Geodetic CRS: WGS 84
## # A tibble: 15 × 3
## codprov_censo coddepto_censo geometry
## * <chr> <chr> <MULTIPOLYGON [°]>
## 1 02 001 (((-58.34802 -34.601, -58.34713 -34.62111, -58.…
## 2 02 002 (((-58.37501 -34.57959, -58.39365 -34.60154, -5…
## 3 02 003 (((-58.39189 -34.62916, -58.4125 -34.63227, -58…
## 4 02 004 (((-58.33444 -34.63018, -58.34745 -34.63356, -5…
## 5 02 005 (((-58.41263 -34.59991, -58.4125 -34.63227, -58…
## 6 02 006 (((-58.43405 -34.60458, -58.42748 -34.62891, -5…
## 7 02 007 (((-58.45229 -34.63255, -58.42748 -34.62891, -5…
## 8 02 008 (((-58.42483 -34.66387, -58.4471 -34.68962, -58…
## 9 02 009 (((-58.46107 -34.65875, -58.47953 -34.65975, -5…
## 10 02 010 (((-58.47202 -34.63856, -58.50302 -34.64773, -5…
## 11 02 011 (((-58.45919 -34.6064, -58.46017 -34.6158, -58.…
## 12 02 012 (((-58.50419 -34.59586, -58.5158 -34.58304, -58…
## 13 02 013 (((-58.44088 -34.55901, -58.44517 -34.58508, -5…
## 14 02 014 (((-58.39102 -34.57433, -58.41672 -34.59976, -5…
## 15 02 015 (((-58.42408 -34.59965, -58.43405 -34.60458, -5…
(CABA_names <- CABA %>% add_geo_codes())
## Simple feature collection with 15 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -58.52998 ymin: -34.70617 xmax: -58.33444 ymax: -34.53144
## Geodetic CRS: WGS 84
## # A tibble: 15 × 9
## codprov_censo coddepto_censo codprov coddepto nomdepto_censo name_prov
## <chr> <chr> <chr> <chr> <chr> <chr>
## 1 02 001 01 001 COMUNA 01 CABA
## 2 02 002 01 002 COMUNA 02 CABA
## 3 02 003 01 003 COMUNA 03 CABA
## 4 02 004 01 004 COMUNA 04 CABA
## 5 02 005 01 005 COMUNA 05 CABA
## 6 02 006 01 006 COMUNA 06 CABA
## 7 02 007 01 007 COMUNA 07 CABA
## 8 02 008 01 008 COMUNA 08 CABA
## 9 02 009 01 009 COMUNA 09 CABA
## 10 02 010 01 010 COMUNA 10 CABA
## 11 02 011 01 011 COMUNA 11 CABA
## 12 02 012 01 012 COMUNA 12 CABA
## 13 02 013 01 013 COMUNA 13 CABA
## 14 02 014 01 014 COMUNA 14 CABA
## 15 02 015 01 015 COMUNA 15 CABA
## # … with 3 more variables: codprov_iso <chr>, name_iso <chr>,
## # geometry <MULTIPOLYGON [°]>
CABA_names$nomdepto_censo <- gsub("COMUNA ", "C. ", CABA_names$nomdepto_censo)
CABA_names <- CABA_names %>%
mutate(esp_verd = case_when(
coddepto_censo == "001" ~ 18.2,
coddepto_censo == "002" ~ 4.1,
coddepto_censo == "003" ~ 0.4,
coddepto_censo == "004" ~ 4.3,
coddepto_censo == "005" ~ 0.2,
coddepto_censo == "006" ~ 1.8,
coddepto_censo == "007" ~ 3.2,
coddepto_censo == "008" ~ 18.8,
coddepto_censo == "009" ~ 6.8,
coddepto_censo == "010" ~ 2.0,
coddepto_censo == "011" ~ 1.5,
coddepto_censo == "012" ~ 8.1,
coddepto_censo == "013" ~ 6.1,
coddepto_censo == "014" ~ 12.0,
coddepto_censo == "015" ~ 6.2
))
ggplot(CABA_names)+
geom_sf(aes(fill = esp_verd))+
geom_sf_label(aes(label = nomdepto_censo),
#label.size = 0.5,
size = 2)+
scale_fill_gradient(low = "khaki2", high = "darkgreen")+
labs(title = "Superficie de espacio verde dependiente del GCBA por habitante \npor comuna (2019)",
caption = "Fuente: https://www.estadisticaciudad.gob.ar/eyc/?p=27349",
x = "",
y = "",
fill = expression('Espacio verde en m' ^ 2))+
theme(axis.text = element_blank(),
axis.ticks = element_blank(),
panel.background = element_blank()
)
## Warning in st_point_on_surface.sfc(sf::st_zm(x)): st_point_on_surface may not
## give correct results for longitude/latitude data