Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Introduction
A super simple post that summarizes R-based methods for visual summary & collage-building using image attachments on Twitter. In the process, a bit of a photo homage to Congresswoman Xochitl Torres Small in her first year representing New Mexico’s 2nd district.
if (!require("pacman")) install.packages("pacman") pacman::p_load(tidyverse, rtweet, tigris) options(tigris_use_cache = TRUE, tigris_class = "sf")
New Mexico’s 2nd District
The 2nd congressional district of New Mexico is a super fun district. It is not my district, but I have a few stomping grounds that way. Faywood is home to natural hot springs and a STAR-GAZING CHAIR!!!. Weed has an absolutely lovely frisbee golf course. Ruidoso has all things: including two disc golf courses and a horse track.
Folks in the district supported Trump in 2016 by a fair margin (+10.2%) and subsequently sent a freshman Democrat to the House in 2018. Only the second time the district has sent a Democrat to the House in the last 30 years. Also, it is one of only five districts that supported Trump by more than ten points, supported McCain in 2008 & Romney in 2012, and sent a Democrat to Congress in 2018. I have written some previously about Torres Small’s win in 2018 and the demographics of the district.
So, a complicated & ideologically diverse district. And Congresswoman Torres Small does an amazing job representing this diversity. She is one of the few House Dems that engages with Fox News, eg, writing op-eds and doing interviews. And she is a super positive Twitter follow if you are interested in feeling good about the folks that represent us in Congress.
The district is also geographically vast – and super-rural. Per the table below, NM-02 is the fifth largest district in the country – only the big rural states with at-large representation are bigger. So, lots of ground to cover.
cds <- tigris::congressional_districts(cb = TRUE) cds %>% data.frame() %>% arrange(desc(ALAND)) %>% slice(1:5) %>% mutate(ALAND = round(ALAND/ 2.59e+6,0), # SQUARE MILES ALAND = format(ALAND, big.mark=",", scientific=FALSE), geo = c('Alaska', 'Montana', 'Wyoming', 'South Dakota', 'New Mexico - 02')) %>% select(geo, GEOID, ALAND)%>% knitr::kable()
geo | GEOID | ALAND |
---|---|---|
Alaska | 0200 | 570,883 |
Montana | 3000 | 145,545 |
Wyoming | 5600 | 97,091 |
South Dakota | 4600 | 75,809 |
New Mexico – 02 | 3502 | 71,745 |
One hundred days into her term in the 116th Congress, Congresswoman Torres Small tweeted:
In #100Days, I’ve ✈️???? over 43,000 miles & met w/ constituents in
✅Bernalillo ✅Catron ✅Chaves ✅Cibola ✅De Baca ✅Dona Ana ✅Eddy ✅Grant ✅Guadalupe ✅Hidalgo ✅Lea ✅Lincoln ✅Luna ✅McKinley ✅Otero ✅Roosevelt ✅Sierra ✅Socorro ✅Valencia
And I’m just getting started
So, she is on the move. The map below highlights the district in geographical context. Lots of big districts in the Southwest. NM-02 is roughly bounded by Mexico, West Texas, ABQ/Santa Fe metros, and the Navajo Nation. A bit of cultural crossroads, as it were.
world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf") %>% filter(gu_a3 %in% c('USA', 'MEX')) states <- tigris::states(cb = TRUE) cds %>% mutate(color = ifelse(GEOID == '3502', 'blue', 'gray')) %>% ggplot() + geom_sf(data = world, color = 'darkgray', alpha = .75, fill = '#dae2ba', size = 1.1) + geom_sf(aes(fill = color), color = 'darkgray') + scale_fill_manual(values = c('lightblue', 'gray')) + ggsflabel::lims_bbox(cds %>% filter(STATEFP %in% c('04', '48', '35', '32'))) + geom_sf(data = states, color = 'darkgray', alpha = 0, size = 1.1) + theme(legend.position = 'none') + ggtitle('NM-02 in context')
Collaging the year’s happenings
So, the goal here is to provide a visual summary (ie, collage) of Congresswoman Torres Small’s year representing NM-02 using images from Twitter. Via the rtweet
package, we collect all of @RepTorresSmall
tweets since she took office at the beginning of 2019.
xochitl_tweets <- rtweet::get_timeline( "RepTorresSmall", n = 1500, check=FALSE) %>% mutate(created_at = as.Date(gsub(' .*$', '', created_at))) %>% filter(is_quote == 'FALSE' & is_retweet == 'FALSE' & created_at > '2019-01-02' & display_text_width > 0)
Next, we identify tweets containing photo attachments. And then download these photos locally. The code presented here has been modified directly from this post. For a more detailed walk through of methods, I would recommend having a look.
pics <- xochitl_tweets %>% filter(!is.na(media_url)) %>% select(media_url, created_at) setwd(local_pics) lapply(pics$media_url, function (y) { magick::image_read(y) %>% magick::image_scale("1000") %>% magick::image_border('white', '10x10') %>% magick::image_write(gsub('^.*/', '', y)) #%>% #magick::image_annotate(pics$created_at[y], = 'Times', size = 50) })
Next, we shuffle the photos some, and then stack photos as a collection of single column collages. Again, these intermediary files are stored locally.
files <- dir(local_pics, full.names = TRUE) set.seed(11) files <- sample(files, length(files)) files1 <- files[1:49] no_rows <- 7 no_cols <- 7 make_column <- function(i, files, no_rows){ magick::image_read(files[(i*no_rows+1):((i+1)*no_rows)]) %>% magick::image_append(stack = TRUE) %>% magick::image_write(paste0("cols", i, ".jpg"))} setwd(local_cols) walk(0:(no_cols-1), make_column, files = files1, no_rows = no_rows)
Lastly, we piece together the column collages as a single collage. For good measure, I created three collages comprised of 7 x 7 = 49 photos. A busy year for the Congresswoman.
magick::image_read(dir(local_cols, full.names = TRUE)) %>% magick::image_scale("500x1000") %>% magick::image_append(stack = FALSE)
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.