These 4 code chunks create a Sahm indicator/rule chart.

1. Load libraries

library(tidyquant)
library(tidyverse) 
library(janitor) # for clean_names
library(slider)

2. Create “theme” object with preferred settings (change as desired, ignore those that don’t apply obviously)

theme =  
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.minor.x = element_blank(),
    plot.title = element_text(size = 30, lineheight = .9, face = "bold", hjust = .5, vjust = .75, family = "serif"
    ),
    plot.subtitle = element_text(hjust = .5, vjust = 1, family = "serif", size = 20),
    plot.caption = element_text(hjust = .5, family = "serif", size = 15),
    panel.background = element_rect(fill = "white"),
    axis.title = element_text(family = "serif", size = 20),
    axis.text = element_text(size = 20, family = "serif"),
    axis.line.y = element_line(color = "black"),
    axis.line.x = element_line(color = "black"),
    strip.text = element_text(size = 15, family = "serif"),
    strip.background.x = element_rect(fill = "lightblue"))

3. Create recession list for chart recession bars

I use a list, but you may have a more compact solution.

recessions.df =
  read.table(
    textConnection(
      "begin, end
1857-06-01, 1858-12-01
1860-10-01, 1861-06-01
1865-04-01, 1867-12-01
1869-06-01, 1870-12-01
1873-10-01, 1879-03-01
1882-03-01, 1885-05-01
1887-03-01, 1888-04-01
1890-07-01, 1891-05-01
1893-01-01, 1894-06-01
1895-12-01, 1897-06-01
1899-06-01, 1900-12-01
1902-09-01, 1904-08-01
1907-05-01, 1908-06-01
1910-01-01, 1912-01-01
1913-01-01, 1914-12-01
1918-08-01, 1919-03-01
1920-01-01, 1921-07-01
1923-05-01, 1924-07-01
1926-10-01, 1927-11-01
1929-08-01, 1933-03-01
1937-05-01, 1938-06-01
1945-02-01, 1945-10-01
1948-11-01, 1949-10-01
1953-07-01, 1954-05-01
1957-08-01, 1958-04-01
1960-04-01, 1961-02-01
1969-12-01, 1970-11-01
1973-11-01, 1975-03-01
1980-01-01, 1980-07-01
1981-07-01, 1982-11-01
1990-07-01, 1991-03-01
2001-03-01, 2001-11-01
2007-12-01, 2009-06-01
2020-04-01, 2020-06-01"
    ),
sep = ',',
colClasses = c('Date', 'Date'),
header = TRUE
  )

4. Create chart

c("UNRATE") %>% 
       tq_get(get = "economic.data", from = "1947-01-01") %>% 
       clean_names %>% 
       select(date, unrate = price) %>% 
       mutate(low = slide_dbl(unrate, .f = min, .before = 11, .complete = T),
              ma = slide_dbl(unrate, .f = mean, .before = 2, .complete = T),
              Sahm = ma - low) %>% 
       drop_na %>% 
       ggplot() +
       geom_rect(aes(xmin = begin, xmax = end, ymin = -Inf, ymax = +Inf), fill = "azure2", data = recessions.df %>%  filter(year(begin) > 1947)) +
       geom_line(aes(x = date, y = Sahm), linewidth = 1.7, color = "steelblue") +
       geom_hline(yintercept = 0.5, color = "darkred") +
       geom_text(aes(x = date, y = Sahm,label = paste0("Current =\n ", round(Sahm, 1))), data = data.table::last, vjust = -.7, size = 7, family = "serif") +
       theme +
       labs(x = NULL, y = "Sahm indicator", caption = "Source: NBER, FRED", subtitle = "Gray bars indicate recessions,\n Red horizontal line = 0.5", title = "Sahm indicator")