# Mortgage rate skyline chart

## R code for a mortgage rate skyline chart

About a year ago I made a chart and Bob Rudis dubbed it a skyline chart. Here’s an updated version I made today. The chart shows a historgram over US weekly average 30-year mortgage rates by year broken into 1/8 percentage points buckets. We see that through this past week, 30-year mortgage rates had spend eight weeks around 2.875 percent.

# R code

The R script below will generate it (using my darklyplot package’s theme_dark2 function). The charts uses ggridges to generate the binlines/little histograms.

library(tidyverse)
library(ggridges)
library(darklyplot)
library(lubridate)
df <-
tidyquant::tq_get("MORTGAGE30US",get="economic.data") %>%
mutate(pmms30=price,year=year(date)) %>%
mutate(yearf=factor(year))

ggplot(data=filter(df,year>2009),
aes(y=forcats::fct_reorder(yearf,-year),
x=pmms30,group=forcats::fct_reorder(yearf,-year),
fill=yearf))+
geom_density_ridges2(color="white",size=0.2,
alpha=0.85,scale=0.75,
stat="binline",
binwidth=0.125)+
geom_text(stat = "bin",
aes(y = group + 0.9*(..count../max(..count..)),
label = ifelse(..count..>0, ..count.., "")
),
vjust = 0.2, size = 4, color = "white", binwidth = 0.125) +
geom_vline(data= .%>% filter(date==max(date)), linetype=2, color="white",aes(xintercept=pmms30))+
scale_fill_viridis_d(option="C")+
scale_color_viridis_d(option="C")+
scale_x_continuous(limits=c(2,6),breaks=seq(2,6,0.25))+
theme_dark2(base_family="Arial",base_size=12)+
theme(panel.grid.minor=element_blank(),
legend.position="none",
plot.title=element_text(size=rel(1.5),face="bold"),
plot.subtitle=element_text(size=rel(1.3),face="italic"),
panel.grid.major.x=element_blank())+
labs(x="30-year fixed mortgage rate (%)\n",
y="Year",
caption=paste0("@lenkiefer Source: Freddie Mac Primary Mortgage Market Survey,",
"\nDotted line at ",
df[df$date==max(df$date),]$pmms30,"% average for week of ", as.character(max(df$date), format="%B %d, %Y")),
title="Distribution over weekly mortgage rates by year",
subtitle="Histograms fit to weekly observations for each year\n")