问题描述
我正在尝试生成一个ggplot图,可以在其中比较两个时间段而不编制数据索引。因此,我有一个时间窗口沿底部的x轴运行,而一个时间窗口沿顶部的x轴运行,有点像tidyverse manual page中的示例(请参见链接页面的底部)。
但是我也想在y轴上有双轴,类似这样的东西(使用下面的代码通过复制粘贴来实现),
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 1
和time-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()
解决方法
也许这就是您想要的:
- 对于日期转换,我使用
lubridate::years
。另外,为了在sec_axis
内部进行转换,我将换成hms::hms
,否则会出错。 - 由于我个人发现辅助轴总是有些混乱,尤其是与辅助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]))