Skip to contents

Overview

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

library(ggaib)
#> Brand fonts not found. Using bundled alternatives (Albert Sans, Source Sans 3, Crimson Text).
library(ggplot2)

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 three core themes included in the ggaib package, 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",
    x = "Per-Pupil Expenditures\n($1,000s)",
    y = "Avgerage Math Score",
    caption = "Note: Simulated data for illustration"
  ) +
  theme_aib() +
  aib_color_title(
    "For Urban, Suburban, and Rural school districts",
    colors = c(
      "Urban"    = unname(aib_colors("navy")),
      "Suburban" = unname(aib_colors("red")),
      "Rural"    = unname(aib_colors("emerald"))
    ),
    element = "subtitle"
  ) +
  theme(legend.position = "none")

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)) +
  labs(
    title = "Reading Achievement Gap Over Time",
    x = NULL,
    y = "Average Reading Score"
  ) +
  theme_aib_grid() +
  aib_color_title(
    "Higher-Income and Lower-Income 4th-grade scores",
    colors = c(
      "Higher-Income" = unname(aib_colors("navy")),
      "Lower-Income"  = unname(aib_colors("red"))
    ),
    element = "subtitle"
  ) +
  aib_direct_label(gap_data, "year", "score", "group",
                   limits = c(215, 300), breaks = seq(200, 300, 20))

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()`).