Skip to contents

Overview

The ggaib package provides ggplot2 themes and color scales for the Annenberg Institute at Brown University. It includes four theme variants and discrete, continuous, and diverging color scales using the Institute’s brand palette.

Brand Colors

Access the full palette or select specific colors:

aib_colors()
#>      navy       red   emerald    yellow       sky     taupe     brown      gray 
#> "#1B3E6F" "#C00404" "#00AF9A" "#EBA900" "#55C8E8" "#B6B09D" "#503629" "#97A3AE"
aib_colors("navy", "red", "emerald")
#>      navy       red   emerald 
#> "#1B3E6F" "#C00404" "#00AF9A"

Themes

There are four core themes included in the ggaib pacakge, each optimized for a different use case. All themes share the same base font and color palette, but differ in gridline and axis styling to suit different types of visualizations.

Publication (default)

set.seed(42)
districts <- data.frame(
  spending = c(rnorm(40, 11, 2), rnorm(40, 15, 2.5), rnorm(40, 13, 3)),
  avg_score = c(rnorm(40, 250, 15), rnorm(40, 270, 12), rnorm(40, 258, 18)),
  urbanicity = rep(c("Urban", "Suburban", "Rural"), each = 40)
)

ggplot(districts, aes(spending, avg_score, color = urbanicity)) +
  geom_point(size = 2) +
  scale_color_aib() +
  scale_x_continuous(labels = aib_label("dollar")) +
  scale_y_continuous(limits = c(215, 300), breaks = seq(200, 300, 20)) +
  labs(
    title = "Per-Pupil Spending and Math Achievement",
    subtitle = "Simulated school district data",
    x = "Per-Pupil Expenditures\n($1,000s)",
    y = "Avgerage Math Score",
    color = "Urbanicity",
    caption = "Note: Simulated data for illustration"
  ) +
  theme_aib()

Grid

set.seed(42)
years <- 2005:2023
gap_data <- data.frame(
  year = rep(years, 2),
  group = rep(c("Higher-Income", "Lower-Income"), each = length(years)),
  score = c(
    270 + cumsum(rnorm(length(years), 0.3, 0.8)),
    240 + cumsum(rnorm(length(years), 0.8, 0.9))
  )
)

ggplot(gap_data, aes(year, score, color = group)) +
  geom_line(linewidth = 1) +
  scale_color_aib() +
  scale_x_continuous(
    breaks = seq(2005, 2025, 3)
  ) +
  scale_y_continuous(
    limits = c(215, 300),
    breaks = seq(200, 300, 20)
  ) +
  labs(
    title = "Reading Achievement Gap Over Time",
    subtitle = "4th-grade scores by household income",
    x = NULL,
    y = "Average Reading Score",
    color = NULL
  ) +
  theme_aib_grid()

Slide

enrollment <- data.frame(
  type = c("Traditional\nPublic", "Charter", "Magnet", "Private"),
  students = c(47.3, 3.7, 2.5, 5.7)
)
enrollment$type <- factor(enrollment$type, levels = enrollment$type)
enrollment$students <- enrollment$students * 1e6

ggplot(enrollment, aes(type, students, fill = type)) +
  geom_col() +
  scale_fill_aib() +
  scale_y_continuous(labels = aib_label("comma")) +
  labs(
    title = "U.S. K\u201312 Enrollment by School Type",
    x = "Sector",
    y = "Enrollments"
  ) +
  theme_aib_slide() +
  theme(legend.position = "none")

Map

set.seed(42)
states <- ggplot2::map_data("state")
spending_by_state <- data.frame(
  region = unique(states$region),
  spending = runif(length(unique(states$region)), 7, 24)
)
map_df <- merge(states, spending_by_state, by = "region")

ggplot(map_df, aes(long, lat, group = group, fill = spending)) +
  geom_polygon(color = "white", linewidth = 0.2) +
  scale_fill_aib_c() +
  labs(
    title = "Per-Pupil Spending by State",
    fill = "$ (1,000s)",
    caption = "Note: Simulated data for illustration"
  ) +
  coord_fixed(1.3) +
  theme_aib_map()

Color Scales

Continuous

set.seed(42)
schools <- data.frame(
  enrollment = runif(80, 200, 1500),
  avg_score = rnorm(80, 260, 20),
  st_ratio = runif(80, 10, 30)
)
schools$avg_score <- schools$avg_score - (schools$st_ratio - 20) * 1.5

ggplot(schools, aes(enrollment, avg_score, color = st_ratio)) +
  geom_point(size = 2) +
  scale_color_aib_c() +
  scale_x_continuous(labels = aib_label("comma"), breaks = seq(0, 1500, 300)) +
  scale_y_continuous(limits = c(215, 300), breaks = seq(200, 300, 20)) +
  labs(
    title = "Student-Teacher Ratio Across Schools",
    x = "Enrollment",
    y = "Avg. Test Score",
    color = "Student-Teacher\nRatio"
  ) +
  theme_aib()
#> Warning: Removed 3 rows containing missing values or values outside the scale range
#> (`geom_point()`).

Diverging

set.seed(42)
districts2 <- data.frame(
  enrollment = runif(80, 500, 5000),
  avg_score = rnorm(80, 255, 20),
  spending_change = rnorm(80, 0, 6)
)

ggplot(districts2, aes(enrollment, avg_score, color = spending_change)) +
  geom_point(size = 2) +
  scale_color_aib_div() +
  scale_x_continuous(labels = aib_label("comma"), breaks = seq(0, 5000, 500)) +
  scale_y_continuous(limits = c(215, 300), breaks = seq(200, 300, 20)) +
  labs(
    title = "Year-over-Year Spending Change",
    x = "Enrollment",
    y = "Avg. Test Score",
    color = "Spending\nChange (%)"
  ) +
  theme_aib()
#> Warning: Removed 2 rows containing missing values or values outside the scale range
#> (`geom_point()`).