Zach Mayer’s work reproducing John Hussman’s Recession Warning Composite prompted me to dig this trick out of my (Evernote) notebook.
First, let’s grab some data to plot using the very handy getSymbols()
function from Jeffrey Ryan’s quantmod package. We’ll load the U.S. unemployment rate (UNRATE
) from the St. Loius Fed’s Federal Reserve Economic Data (src="FRED"
) and load the time series into a data.frame
:
unrate = getSymbols('UNRATE',src='FRED', auto.assign=F) unrate.df = data.frame(date=time(unrate), coredata(unrate) )
Now FRED provides a USREC
time series which we could use to draw the recessions. It’s a bit awkward, though, as it contains a boolean to flag recession months since January 1921. All we really want are the start and end dates of each recession. Fortunately, the St. Louis Fed publishes just such a table on their web site. (See the answer to “What dates are used for the US recession bars in FRED graphs?” on http://research.stlouisfed.org/fred2/help-faq/.) Sometimes it’s still easier to cut-and-paste (and the static table covers another 64 years, go figure):
recessions.df = read.table(textConnection( "Peak, Trough 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"), sep=',', colClasses=c('Date', 'Date'), header=TRUE)
Now the only “gotcha” is that our recession data start long before our unemployment data, so let’s trim it to match:
recessions.trim = subset(recessions.df, Peak >= min(unrate.df$date) )
Finally, we use ggplot2’s geom_line()
layer to draw the unemployment data and transparent (alpha=0.2
) pink rectangles to overlay the recessions:
g = ggplot(unrate.df) + geom_line(aes(x=date, y=UNRATE)) + theme_bw() g = g + geom_rect(data=recessions.trim, aes(xmin=Peak, xmax=Trough, ymin=-Inf, ymax=+Inf), fill='pink', alpha=0.2)
August 16, 2011 at 11:11 AM
great to know ggplot2 way, I did something similar using the old plain plot
https://plus.google.com/113343233004517014766/posts/C3Wb5rzFQun
August 16, 2011 at 11:36 AM
Wow — that’s a lot prettier than I’m used to seeing from plot() — did you tweak after?
August 17, 2011 at 6:51 AM
[…] Use geom_rect() to add recession bars to your time series plots #rstatsĀ #ggplot Zach Mayer’s work reproducing John Hussman’s Recession Warning Composite prompted me to dig this trick out of my (Evernote) notebook. First, let’s grab some data to plot using the very handy get… Source: jeffreybreen.wordpress.com […]
August 17, 2011 at 11:04 AM
[…] Use geom_rect() to add recession bars to your time series plots #rstats #ggplot Ā« Things I tend to … (tags: stats:time-series stats:visualization) […]
October 28, 2013 at 12:04 PM
Reblogged this on isomorphismes.
November 7, 2014 at 9:04 PM
Neat! I guess this is pretty similar intuitively to the Excel approach, but it’s great to be able to explicitly specify dimensions instead of using hacks with bar charts. Thanks for sharing.