ggplot2指定值和日期/日期时间的辅助轴

问题描述

我正在尝试生成一个图,可以在其中比较两个时间段而不编制数据索引。因此,我有一个时间窗口沿底部的x轴运行,而一个时间窗口沿顶部的x轴运行,有点像 manual page中的示例(请参见链接页面底部)。

但是我也想在y轴上有双轴,类似这样的东西(使用下面的代码通过复制粘贴来实现),

ggplot2 specify a secondary axis for both value and date/datetime

economics_long %>% filter(variable== "pce" & date  > "2008-01-01" & date < "2010-01-01") %>% 
  ggplot(aes(date,value01,colour = variable)) + geom_line()

economics_long %>% filter(variable== "pce" & date  > "1990-01-01" & date < "1992-01-01") %>% 
  ggplot(aes(date,colour = variable)) + geom_line()

我想我需要使用bind_rows()来缩短两个时间段并将它们放在最前面,并可能创建一个variable这样的新变量,并提供两个选项,例如time-window 1time-window 2,但是在开始手动构建疯狂的东西之前,我想问一下这里。也许其他人做了类似的事情?

我已经迈出了第一步,

tw01 <- economics_long %>% 
filter(variable== "pce" & date  > "2008-01-01" & date < "2010-01-01")
tw02 <- economics_long %>% 
filter(variable== "pce" & date  > "1990-01-01" & date < "1992-01-01")

tw02$date <- tw01$date
tw <- bind_rows(tw01,tw02,.id = "time_window")
tw %>% ggplot(aes(date,colour = time_window)) + geom_line()

解决方法

也许这就是您想要的:

  1. 对于日期转换,我使用lubridate::years。另外,为了在sec_axis内部进行转换,我将换成hms::hms,否则会出错。
  2. 由于我个人发现辅助轴总是有些混乱,尤其是与辅助x和y轴都混淆时,我根据线条的颜色对x和y标签进行了着色。如果您不喜欢,可以直接删除theme()调整项。
library(ggplot2)
library(dplyr)

tw1_START <- "2008-01-01"; tw1_END <- "2010-01-01"
tw2_START <- "1990-01-01"; tw2_END <- "1992-01-01"
s_factor <- .52

Intv <- interval(ymd(tw2_START),ymd(tw1_START))
IntvM <-  time_length(Intv,"month") # time_length(YrDis,"year")


tw01 <- economics_long %>% 
  filter(variable== "pce" & date  > tw1_START  & date < tw1_END )

tw02 <- economics_long %>% 
  filter(variable== "pce" & date  > tw2_START  & date < tw2_END) %>% 
  mutate(date = date +  hms::hms(months(IntvM))) %>% 
  mutate(value01 = value01 + s_factor)


tw <- bind_rows(tw01,tw02,.id = "time_window")
tw %>% 
  ggplot(aes(date,value01,colour = time_window)) + 
  geom_line() + 
  scale_x_date(sec.axis = sec_axis(~ . -hms::hms(months(IntvM))))  + 
  scale_y_continuous(sec.axis = sec_axis(~ . - s_factor),position = "right") +
  theme(axis.text.x.top = element_text(color = scales::hue_pal()(2)[2]),axis.text.x.bottom = element_text(color = scales::hue_pal()(2)[1]),axis.text.y.right = element_text(color = scales::hue_pal()(2)[1]),axis.text.y.left = element_text(color = scales::hue_pal()(2)[2]))