In the tidyverse

Using the tidyverse set of R packages

require(readr)
require(ggplot2)
require(dplyr)
require(scales)

s5 <- read_csv("https://metrics.torproject.org/stats/servers.csv") %>% 
  filter(flag == "HSDir") %>% 
  select(date, relays) %>% 
  mutate(date = as.Date(date))

h5 <- read_csv("https://metrics.torproject.org/stats/hidserv.csv") %>% 
  filter(type == "dir-onions-seen") %>% 
  select(date, wiqm) %>% 
  mutate(date = as.Date(date))

m5 <- full_join(s5, h5, by = "date") %>% 
  rename(hsdirs = relays, onions = wiqm) 

ggplot(m5, aes(x = date, y = 6 * onions / hsdirs)) +
  geom_line() +
  scale_x_date(name = "") +
  scale_y_continuous(name = "") +
  expand_limits(y = 0) +
  ggtitle("Average onion service descriptor count per directory\n") +
  theme(plot.title = element_text(hjust = 0.5))

Starting in 2015

m6 <- m5 %>% filter(date >= "2014-12-15")

ggplot(m6, aes(x = date, y = 6 * onions / hsdirs)) +
  geom_line() +
  scale_x_date(name = "") +
  scale_y_continuous(name = "") +
  expand_limits(y = 0) +
  ggtitle("Average onion service descriptor count per directory\n") +
  theme(plot.title = element_text(hjust = 0.5))