Video Boards of the Power 5 Conferences | Ben Cunningham

Video Boards of the Power 5 Conferences

Written by Ben Cunningham · on August 13, 2017

College football is almost here. In a fury of anticipation, I spent my weekend reimagining the information in the awesome “Video Boards of the Power 5 Conferences” infographics made by @JediASU (see the ACC, B1G, Big XII, Pac-12, and SEC images linked).

I can’t take credit for the idea (the images actually all reference John T. Roosevelt’s “A Scaled View of Every Jumbotron in the NFL” as inspiration) or all the effort that went in to originally collecting the data. But after scraping together some of the board dimensions and other attributes into a table, I thought it would make for a fun little preseason project.

See my result below and the R source code (mainly ggplot2) after that.

library(tidyverse)
library(animation)
library(gridExtra)

df <-
  read_csv("data/video_boards.csv") %>%
  mutate(sq_ft = width * height) %>%
  arrange(desc(sq_ft)) %>%
  mutate(n = 1:n())

t_colors <- list(
  background = "#E6E6E6",
  bg_marks = "#CCCCCC",
  fg_marks = "#88419D",
  text = "#5D646F",
  titles = "#3A3F4A"
)
  
t_theme <-
  theme_minimal() +
  theme(
    text = element_text(family = "Ubuntu Condensed", face = "plain", color = t_colors$titles),
    legend.position = "none",
    axis.title = element_text(size = 10),
    axis.text = element_text(size = 10),
    strip.text.x = element_text(size = 12),
    panel.grid.major = element_line(linetype = "dotted", size = 0.2, color = t_colors$text),
    panel.grid.minor = element_blank(),
    plot.title = element_text(face = "bold", size = 24, margin = margin(b = 10, t = 10)),
    plot.subtitle = element_text(size = 14, face = "plain", margin = margin(b = 20)),
    plot.caption = element_text(size = 10, margin = margin(t = 30), color = t_colors$text),
    plot.margin = unit(rep(1, 4), "cm"),
    plot.background = element_rect(fill = t_colors$background, linetype = "blank")
  )

saveGIF(map(df$team, function(t) {

  p_rect <-
    ggplot() +
    geom_rect(
      data = df,
      aes(
        xmin = - width / 2,
        xmax = + width / 2,
        ymin = rise,
        ymax = rise + height
      ),
      color = t_colors$bg_marks,
      alpha = 0
    ) +
    geom_rect(
      data = filter(df, team == t),
      aes(
        xmin = - width / 2,
        xmax = + width / 2,
        ymin = rise,
        ymax = rise + height
      ),
      color = t_colors$fg_marks,
      fill  = t_colors$fg_marks,
      alpha = 0.1
    ) +
    facet_wrap(~ conference, nrow = 1) +
    coord_fixed() +
    lims(x = c(-100, 100), y = c(0, 200)) +
    labs(
      title = "Video Boards of College Football",
      subtitle = sprintf(
        "#%s %s, %s\n%s × %s; %s square feet",
        df$n[df$team == t], t, df$stadium[df$team == t],
        df$width[df$team == t], df$height[df$team == t], df$sq_ft[df$team == t]
      ),
      x = "Width (All Video Boards Centered at Zero)",
      y = "Rise from Field"
    ) +
    t_theme

  p_bar <-
    ggplot() +
    geom_col(
      data = df,
      aes(reorder(team, n), sq_ft),
      color = t_colors$bg_marks,
      fill  = t_colors$bg_marks,
      width = 0.05
    ) +
    geom_col(
      data = filter(df, team == t),
      aes(reorder(team, n), sq_ft),
      color = t_colors$fg_marks,
      fill  = t_colors$fg_marks,
      width = 0.05
    ) +
    scale_x_discrete(breaks = NULL) +
    scale_y_continuous(breaks = seq(0, 1e4, 2.5e3)) +
    labs(
      caption = " ",
      x = "",
      y = "Area (Square Feet)"
    ) +
    t_theme

  p_point <-
    ggplot() +
    geom_point(
      data = df,
      aes(width, height),
      color = t_colors$bg_marks
    ) +
    geom_point(
      data = filter(df, team == t),
      aes(width, height),
      color = t_colors$fg_marks
    ) +
    labs(
      x = "Width",
      y = "Height",
      caption = paste(
        'Data Source: @JediASU, "Video Boards of the Power',
        '5 Conferences" series | Plot: benjcunningham.org'
      )
    ) +
    t_theme

  grid.arrange(
    p_rect, p_bar, p_point,
    layout_matrix = rbind(
      rep(1, 5),
      rep(1, 5),
      rep(1, 5),
      c(2, 2, 2, 3, 3),
      c(2, 2, 2, 3, 3)
    )
  )

}), "video-boards.gif", interval = 1, ani.height = 580, ani.width = 875)