Bases perronas Vol. I: Barragán

2021-08-10
12 min read

Inauguro este espacio escribiendo sobre cosas que me gustan y por las que me interesé en las bases de datos. Una de esas cosas es la de recopilar información de la internet y jugar con ella, con liberad y quizás como detonante de otras ideas.

Un ejemplo es la base de la Fundación Barragán, establecida en 1996 en Birsfelden en Suiza. Llegué a ella por una discusión en twitter y me impresioné del trabajo tan minucioso de la fundación por recuerar el legado de Barragán. Pensé que sería interesante tener esa información en una base de datos y jugar con ella a voluntad. Acá les comparto el proceso.

Bibliotecas

Voy a usar el conjunto de paquetes del tidyverse para el tratamiento general de los datos y el raspador web (scrapeador) rvest.

 

 

pacman::p_load(tidyverse, rvest, rayshader, tmap)

 

 

Definir el URL

Extraeré la información Barragán en mi computadora.

 

 

url <- "https://www.barragan-foundation.org/works/list"

 

 

Iniciar el raspado (scraping)

Utilicé Selector Gadget para seleccionar en la página de la Fundación Barragán las ubicaciones de las piezas de información que necesitaba. Esta herramiente me permitió por ejemplo, seleccionar todos los años de las obras gracias que están ubicadas en .work-year. Al poner esta ubicación en el comando html_nodes() puedo extraer todo lo que se encuentre en ese lugar.

Así fue como construí un objeto para cada uno de los elementos que necesitaba. Probablemente este es un buen espacio para pensar en una función o en un apply que ahorre líneas de código.

 

 


yr <- read_html(url) %>% 
  html_nodes(".work-year") %>% 
  html_text()

titulo <- read_html(url) %>% 
  html_nodes(".work-title") %>% 
  html_text()

categoria <- read_html(url) %>% 
  html_nodes(".category") %>% 
  html_text()

colaboracion <- read_html(url) %>% 
  html_nodes(".meta-collab") %>% 
  html_text()

locacion <- read_html(url) %>% 
  html_nodes(".short-location") %>% 
  html_text()

 

 

Coordenadas

url_map <- "https://www.barragan-foundation.org/works/map"

lat <- read_html(url_map) %>% 
  html_nodes("section")%>% 
  html_attr("data-lat")

long <- read_html(url_map) %>% 
  html_nodes("section")%>% 
  html_attr("data-lon")

dir <- read_html(url_map) %>% 
  html_nodes("section")%>% 
  html_attr("data-addr")

 

 

Pegamos todo en un tibble

Uní todas las partes que fui recolectando en una sola tabla.

 

 

barragan <- tibble(
  year = yr %>% str_squish(),
  titulo, 
  categoria = categoria %>% str_squish(),
  colaboracion=colaboracion %>% str_squish(),
  locacion=locacion %>% str_squish(),
  latitud = lat,
  longitud = long,
  direccion = dir
)

glimpse(barragan)
## Rows: 168
## Columns: 8
## $ year         <chr> "1927", "1927, 1936", "Late 1920s", "Late 1920s", "Late 1~
## $ titulo       <chr> "Houses for Adolfo Robles Castillo", "Robles León House",~
## $ categoria    <chr> "Semi-detached residences", "Townhouse; renovation, exten~
## $ colaboracion <chr> "", "Collaborating architect in the 1936 intervention: Ig~
## $ locacion     <chr> "Guadalajara, State of Jalisco", "Guadalajara, State of J~
## $ latitud      <chr> "20.674519", "20.673354", "20.681558", "20.684803", "20.6~
## $ longitud     <chr> "-103.361219", "-103.353713", "-103.34688", "-103.34877",~
## $ direccion    <chr> "1095 Avenida Vallarta and 27 Calle Argentina, Colonia Am~

 

 

¿Qué hacer con esta base? Pues, además de conocer la obra de Barragán, quizás sea una buena oportunidad para visualizar. Por ejemplo, la localización de cada una de sus obras. Voy a usar sf de Edzer Pebesma y tmap de Martijn Tennekes.

 

 

tmap_mode("view")
## tmap mode set to interactive viewing

mapa <- barragan %>% 
  mutate(across(c(latitud, longitud), 
                as.numeric)) %>% 
  filter(!is.na(longitud)) %>% 
  sf::st_as_sf(coords = c("longitud", "latitud"), 
               crs = 4329)

tm_shape(mapa) + tm_dots()

 

 

Pièce de résistance

Y aquí es donde se me ocurrió una idea: “imaginemos que cada punto en donde se localiza una obra de Barragán fuera una torre de Satélite”. Así es como hice los pasos prohibidos: rayshader de Tyler Morgan-Wall,

 

 


primcol <- c("white","yellow", "blue", "grey80", "red")


#color=sample(primcol, 16, replace=T)
  
satelite <- barragan %>% 
  filter(locacion == "Guadalajara, State of Jalisco") %>% 
  filter(!is.na(latitud)) %>% 
  mutate(alto = floor(runif(n(), min=1, max=5))) %>% 
  add_row(alto = 0) %>% 
  ggplot(aes(latitud, longitud,
             color = alto)) +
  geom_point(size = 5, shape=17) +
  scale_color_gradientn(colours = primcol) +
  guides(color = "none") +
  theme(axis.text = element_blank(),
        axis.title = element_blank(),
        panel.background = element_blank(), 
        axis.ticks = element_blank())

satelite

plot_gg(satelite, width = 5, 
        multicore = TRUE, windowsize = c(1400, 700), 
        zoom = 0.3, phi = 35, 
        theta = 30, sunangle = 200, 
        soliddepth = -100)

Sys.sleep(5)

render_snapshot()

 

 

Resultado final

 

 

 

 

Datos sobre la sesión

sessionInfo()
## R version 4.1.1 (2021-08-10)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 18362)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=Spanish_Mexico.1252  LC_CTYPE=Spanish_Mexico.1252   
## [3] LC_MONETARY=Spanish_Mexico.1252 LC_NUMERIC=C                   
## [5] LC_TIME=Spanish_Mexico.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] tmap_3.3-2       rayshader_0.26.1 rvest_1.0.0      forcats_0.5.1   
##  [5] stringr_1.4.0    dplyr_1.0.7      purrr_0.3.4      readr_1.4.0     
##  [9] tidyr_1.1.3      tibble_3.1.2     ggplot2_3.3.4    tidyverse_1.3.1 
## 
## loaded via a namespace (and not attached):
##  [1] leafem_0.1.6            colorspace_2.0-1        selectr_0.4-2          
##  [4] ellipsis_0.3.2          class_7.3-19            leaflet_2.0.4.1        
##  [7] base64enc_0.1-3         fs_1.5.0                dichromat_2.0-0        
## [10] rstudioapi_0.13         proxy_0.4-26            farver_2.1.0           
## [13] fansi_0.5.0             lubridate_1.7.10        xml2_1.3.2             
## [16] codetools_0.2-18        extrafont_0.17          doParallel_1.0.16      
## [19] knitr_1.33              jsonlite_1.7.2          tmaptools_3.1-1        
## [22] broom_0.7.7             Rttf2pt1_1.3.8          dbplyr_2.1.1           
## [25] png_0.1-7               compiler_4.1.1          httr_1.4.2             
## [28] backports_1.2.1         assertthat_0.2.1        cli_3.0.1              
## [31] s2_1.0.6                leaflet.providers_1.9.0 htmltools_0.5.1.1      
## [34] prettyunits_1.1.1       tools_4.1.1             gtable_0.3.0           
## [37] glue_1.4.2              wk_0.4.1                Rcpp_1.0.7             
## [40] cellranger_1.1.0        jquerylib_0.1.4         raster_3.4-13          
## [43] vctrs_0.3.8             blogdown_1.4            extrafontdb_1.0        
## [46] iterators_1.0.13        leafsync_0.1.0          crosstalk_1.1.1        
## [49] lwgeom_0.2-7            xfun_0.24               lifecycle_1.0.0        
## [52] pacman_0.5.1            XML_3.99-0.6            scales_1.1.1           
## [55] hms_1.1.0               parallel_4.1.1          RColorBrewer_1.1-2     
## [58] yaml_2.2.1              curl_4.3.1              sass_0.4.0             
## [61] stringi_1.7.3           highr_0.9               foreach_1.5.1          
## [64] e1071_1.7-7             rlang_0.4.11            pkgconfig_2.0.3        
## [67] rgl_0.107.10            evaluate_0.14           lattice_0.20-44        
## [70] sf_1.0-0                htmlwidgets_1.5.3       tidyselect_1.1.1       
## [73] magrittr_2.0.1          bookdown_0.22           R6_2.5.0               
## [76] generics_0.1.0          DBI_1.1.1               pillar_1.6.2           
## [79] haven_2.4.1             withr_2.4.2             units_0.7-2            
## [82] stars_0.5-3             abind_1.4-5             sp_1.4-5               
## [85] modelr_0.1.8            crayon_1.4.1            KernSmooth_2.23-20     
## [88] utf8_1.2.1              rmarkdown_2.9           progress_1.2.2         
## [91] grid_4.1.1              readxl_1.3.1            reprex_2.0.0           
## [94] digest_0.6.27           classInt_0.4-3          munsell_0.5.0          
## [97] viridisLite_0.4.0       bslib_0.2.5.1
Avatar
Manuel Toral Especialista en análisis datos.