MTA Permanent Art Catalog

bar chart
misc
Published

July 22, 2025

Code
## TidyTuesday Week 29       
## MTA Permanent Art Catalog 


# 1. SETUP

library(pacman)
pacman :: p_load(tidyverse, ggtext, showtext, janitor, scales, gghighlight)

mta_art <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/main/data/2025/2025-07-22/mta_art.csv') %>% 
  clean_names()


# 2. ANALYSIS AND TIDYING 

glimpse(mta_art)

categorize_material <- function(art_material_string) {
  case_when(
    str_detect(str_to_lower(art_material_string), "mosaic|tile") ~ "Mosaic & Tile",
    str_detect(str_to_lower(art_material_string), "bronze|brass|copper") ~ "Bronze & Copper",
    str_detect(str_to_lower(art_material_string), "glass|stained") ~ "Glass",
    str_detect(str_to_lower(art_material_string), "ceramic|porcelain|terra") ~ "Ceramic",
    str_detect(str_to_lower(art_material_string), "steel|iron|metal") ~ "Steel & Iron",
    str_detect(str_to_lower(art_material_string), "stone|granite|marble") ~ "Stone",
    str_detect(str_to_lower(art_material_string), "paint|acrylic|oil") ~ "Paint & Pigments",
    TRUE ~ "Other Materials"
  )
} # funtion to categorize materials (thx gemini)

mta_art_new <- mta_art %>% 
  filter(!is.na(art_date), !is.na(art_material)) %>% 
  mutate(
    material_category = categorize_material(art_material)
  ) %>% 
  filter(
    material_category != "Other Materials",
    !is.na(material_category)
  )

plot <- mta_art_new %>%
  mutate(
    period = case_when(
      art_date >= 1990 & art_date <= 1992 ~ "1990-1992",
      art_date >= 1993 & art_date <= 1995 ~ "1993-1995", 
      art_date >= 1996 & art_date <= 1998 ~ "1996-1998",
      art_date >= 1999 & art_date <= 2001 ~ "1999-2001",
      art_date >= 2002 & art_date <= 2004 ~ "2002-2004",
      art_date >= 2005 & art_date <= 2007 ~ "2005-2007",
      art_date >= 2008 & art_date <= 2010 ~ "2008-2010",
      TRUE ~ "Other"
    ),
    period_mid = case_when(
      period == "1990-1992" ~ 1991,
      period == "1993-1995" ~ 1994,
      period == "1996-1998" ~ 1997,
      period == "1999-2001" ~ 2000,
      period == "2002-2004" ~ 2003,
      period == "2005-2007" ~ 2006,
      period == "2008-2010" ~ 2009,
      TRUE ~ NA_real_
    )
  ) %>%
  filter(period != "Other") %>%
  count(period, period_mid, material_category) %>%
  group_by(period) %>%
  mutate(
    total_period = sum(n),
    percentage = n / total_period * 100
  ) %>%
  ungroup() %>%
  arrange(period_mid, desc(percentage)) %>%
  group_by(period_mid) %>%
  mutate(
    cumsum_pct = cumsum(percentage),
    cumsum_lag = lag(cumsum_pct, default = 0)
  ) %>%
  ungroup() # create dataset to plot 

# 3. AESTHETICS 

font_add_google("Playfair Display", "playfair")
font_add_google("Source Sans Pro", "source")
showtext_auto()

subway_palette <- c(
  "Mosaic & Tile" = "#f94144",
  "Bronze & Copper" = "#f3722c", 
  "Glass" = "#f8961e",
  "Ceramic" = "#f9c74f",
  "Steel & Iron" = "#90be6d",
  "Stone" = "#577590",
  "Paint & Pigments" = "#43aa8b"
)

# 4. PLOT 

plot %>% 
  ggplot(aes(x = period_mid)) +
  
  
  geom_col(aes(y = percentage, fill = material_category),
           width = 2.5, alpha = 0.9, color = "white", size = 0.5) +
  
 
  scale_fill_manual(values = subway_palette, name = "Material") +
  
 
  scale_x_continuous(
    breaks = c(1991, 1994, 1997, 2000, 2003, 2006, 2009),
    labels = c("1990-92", "1993-95", "1996-98", "1999-01", "2002-04", "2005-07", "2008-10"),
    expand = expansion(mult = c(0.08, 0.08))
  ) +
  
  scale_y_continuous(
    labels = function(x) paste0(x, "%"),
    expand = expansion(mult = c(0, 0.02))
  ) +
  
  
  labs(
    title = "<span style='font-size:48px; color:#1a1a1a;'>**The Evolution of Art in NYC's Underground**</span>",
    subtitle = "<span style='font-size:24px; color:#666666;'>Material composition of MTA art installations by period</span>",
    caption = "<span style='font-size:18px; color:#888888;'>Data: MTA Arts & Design | Visualization: anabodevan.github.io</span>",
    x = "",
    y = "Percentage of Artworks"
  ) +
  

  theme_minimal(base_family = "source") +
  theme(
    # Background and panel
    plot.background = element_rect(fill = "#fafafa", color = NA),
    panel.background = element_rect(fill = "#fafafa", color = NA),
    panel.grid = element_blank(),
    
    # Typography
    plot.title = element_markdown(
      family = "playfair", 
      margin = margin(t = 20, b = 10),
      hjust = 0,
      size = 20
    ),
    plot.subtitle = element_markdown(
      margin = margin(b = 30),
      hjust = 0,
      lineheight = 1.3, 
      size = 16
    ),
    plot.caption = element_markdown(
      margin = margin(t = 20),
      hjust = 1,
      size = 14
    ),
    
    # Axes
    axis.text = element_text(color = "#555555", size = 16),
    axis.text.x = element_text(margin = margin(t = 8)),
    axis.text.y = element_text(margin = margin(r = 8)),
    axis.title.y = element_text(
      color = "#555555", 
      size = 12, 
      margin = margin(r = 15),
      angle = 90
    ),
    
    # Legend
    legend.position = "right",
    legend.title = element_text(
      size = 12, 
      color = "#333333", 
      face = "bold",
      margin = margin(b = 10)
    ),
    legend.text = element_text(size = 16, color = "#555555"),
    legend.key.height = unit(0.8, "cm"),
    legend.key.width = unit(0.4, "cm"),
    legend.margin = margin(l = 10),
    
    # Plot margins
    plot.margin = margin(25, 25, 25, 25)
  )


ggsave("mta_art.png",
       width = 12, height = 8, dpi = 300, bg = "white")