结合时间趋势图和时间线

ecl*_*ecl 5 timeline visualization r ggplot2 tidyverse

我想创建一个图(最好使用ggplot2),在其中将时间线与时间趋势图一起可视化。

举个实际的例子,我对每年的失业率进行了汇总。我还有一个数据集,表明与劳动力市场相关的重要立法变化。因此,我想创建一个时间表,其中失业率显示在相同的 x 轴(时间)之后。

我已经生成了一些玩具数据,见下面的代码:

set.seed(2110)
year <- c(1950:2020)
unemployment <- rnorm(length(year), 0.05, 0.005)
un_emp <- data.frame(cbind(year, unemployment))


year <- c( 1957, 1961, 1975, 1976, 1983, 1985, 1995, 1999, 2011, 2018)
events <- c("Implemented unemployment benefit", 
            "Pre-school became free", 
            "Five-day workweek were introduced", 
            "Labor law reform 1976", 
            "Unemployment benefit were cut in half", 
            "Apprenticeship Act allows on-the-job training",
            "Changes in discrimination law",
            "Equal Pay for Equal Work was", 
            "9 weeks vacation were introduced",
            "Unemployment benefit were removed")

imp_event  <- data.frame(year, events)
Run Code Online (Sandbox Code Playgroud)

我可以轻松绘制多年来的时间趋势:

library(tidyverse)
                      
ggplot(data = un_emp, aes(x = year, y = unemployment)) + 
  geom_line(color = "#FC4E07", size = 0.5) +
  theme_bw()
Run Code Online (Sandbox Code Playgroud)

时间趋势。

但是我如何imp_event以一种漂亮而有效的方式在情节中包含事件(在中找到)?我怎样才能做到这一点?

我的目标是让时间线看起来像这里的时间线,但将它与上面显示的时间趋势图结合起来。我怎样才能做到这一点?

在此处输入图片说明

我尝试使用,vline但无法添加事件的标签。

谢谢!

Edu*_*rdo 6

我认为这应该可以解决问题:

首先,我使用 hline 创建了轴,使用您为数据设置的平均值作为 y 截距。然后我在事件的数据框中添加了一个变量“高度”,它采用轴的值并添加一个从正态分布中提取的值。我用它来绘制向每个点创建线条的线段。最后,我反转年份标签的 y 位置,使其始终位于线段的另一侧。

library(tidyverse)

set.seed(2110)
year <- c(1950:2020)
unemployment <- rnorm(length(year), 0.05, 0.005)
un_emp <- data.frame(cbind(year, unemployment))

year <- c( 1957, 1961, 1975, 1976, 1983, 1985, 1995, 1999, 2011, 2018)
events <- c("Implemented unemployment benefit", 
            "Pre-school became free", 
            "Five-day workweek were introduced", 
            "Labor law reform 1976", 
            "Unemployment benefit were cut in half", 
            "Apprenticeship Act allows on-the-job training",
            "Changes in discrimination law",
            "Equal Pay for Equal Work was", 
            "9 weeks vacation were introduced",
            "Unemployment benefit were removed")

imp_event  <- data.frame(year, events) %>% 
  mutate(height = mean(unemployment) + rnorm(n(), 0, 0.02))

    ggplot(un_emp) +
  
  geom_hline(yintercept = 0.05) +
  
  geom_line(aes(x = year,
                y = unemployment),
            color = "red",
            alpha = 0.3,
            size = 1) +
  
  geom_segment(data = imp_event,
               aes(x = year,
                   xend = year,
                   y = 0.05,
                   yend = height)) +
  
  geom_text(data = imp_event,
            aes(label = year, 
                x = year,
                y = 0.05 + 0.002 * sign(0.05 - height)), 
            angle = 90, 
            size = 3.5, 
            fontface = "bold",
            check_overlap = T) +
  
  geom_point(data = imp_event,
             aes(x = year,
                 y = height,
                 fill = as.factor(events)),
             shape = 21,
             size = 4) +
  
  scale_x_continuous(name = NULL, 
                     labels = NULL) +
  
  scale_fill_discrete(name = "Event") +
  
  scale_y_continuous(name = "Unemployment Rate") +
  
  theme_bw() + 
  
  theme(panel.border = element_blank(),
        axis.line.y  = element_line(),
        axis.ticks.x = element_blank(),
        panel.grid = element_blank(),
        legend.position="bottom")
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明