【问题标题】:ggplot2 specify a secondary axis for both value and date/datetimeggplot2 为值和日期/日期时间指定辅助轴
【发布时间】:2020-10-11 14:44:26
【问题描述】:

我正在尝试生成一个 图表,我可以在其中比较两个时间段而无需索引数据。因此,我得到一个时间窗口在底部沿 x 轴运行,一个沿 x 轴在顶部运行,有点像 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, value01, colour = variable)) + geom_line()

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

我已经迈出了第一步,比如,

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, value01, colour = time_window)) + geom_line()

【问题讨论】:

    标签: ggplot tidyverse r ggplot2 timeserieschart


    【解决方案1】:

    也许这就是你要找的东西:

    1. 对于日期转换,我使用lubridate::years。另外,对于 sec_axis 内部的转换,我要换成 hms::hms,否则会出错。
    2. 我个人发现辅助轴总是有点令人困惑,特别是对于辅助 x 和 y 轴,我根据线条的颜色为 x 和 y 标签着色。如果您不喜欢这样,您可以直接删除 theme()adjustemnts。
    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]))
    

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多