---
title: "MTA Permanent Art Catalog"
date: 2025-07-22
categories: [bar chart, misc]
image: 20250722.png
page-navigation: true
execute:
warning: false
message: false
eval: false
format:
html:
code-tools: true
code-fold: true
---
```{r}
## 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")
```