R ggplot2使用facetscales软件包更改每个单独镶嵌面板的日期轴限制

R ggplot2使用facetscales软件包更改每个单独镶嵌面板的日期轴限制,r,ggplot2,R,Ggplot2,我想知道是否有人可以帮助我应用facetscales包为每个方面创建不同的日期范围。我知道在对ggplot的调用中使用scales=free_x可以实现类似的功能,但我希望也可以使用它以编程方式确定每个方面的规模应该扩展的天数 我已经看到了一个相关问题的答案,请参见Uwe的答案,但我无法使用日期正确计算代码 我在下面列出了我的数据的一个简短示例。从Uwe对这个问题的回答来看,我希望有一个ggplot ggproto对象列表,可以作为列表包含在plotting函数中,但是,代码似乎没有正确地计算日

我想知道是否有人可以帮助我应用facetscales包为每个方面创建不同的日期范围。我知道在对ggplot的调用中使用scales=free_x可以实现类似的功能,但我希望也可以使用它以编程方式确定每个方面的规模应该扩展的天数

我已经看到了一个相关问题的答案,请参见Uwe的答案,但我无法使用日期正确计算代码

我在下面列出了我的数据的一个简短示例。从Uwe对这个问题的回答来看,我希望有一个ggplot ggproto对象列表,可以作为列表包含在plotting函数中,但是,代码似乎没有正确地计算日期

非常感谢您的帮助

df <- structure(list(zone = c("zone1", "zone1", "zone1", "zone1", "zone1", 
                                                            "zone1", "zone1", "zone1", "zone1", "zone1", "zone2", "zone2", 
                                                            "zone2", "zone2", "zone2", "zone2", "zone2", "zone2", "zone2", 
                                                            "zone2"), date = structure(c(16294, 16295, 16296, 16297, 16298, 
                                                                                                                     16299, 16300, 16301, 16302, 16303, 16304, 16305, 16306, 16307, 
                                                                                                                     16308, 16309, 16310, 16311, 16312, 16313), class = "Date"), Q = c(317, 
                                                                                                                                                                                                                                                        299, 290, 276, 277, 238, 239, 266, 278, 278, 93, 102, 107, 124, 
                                                                                                                                                                                                                                                        122, 110, 93, 89, 85, 92)), class = c("grouped_df", "tbl_df", 
                                                                                                                                                                                                                                                                                                                                    "tbl", "data.frame"), row.names = c(NA, -20L), groups = structure(list(
                                                                                                                                                                                                                                                                                                                                        zone = c("zone1", "zone2"), .rows = list(1:10, 11:20)), row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    -2L), class = c("tbl_df", "tbl", "data.frame"), .drop = TRUE))


facet_params <- df %>% 
    group_by(zone) %>%
    summarise(start_date=min(date, na.rm=TRUE), end_date=max(date, na.rm=TRUE)) %>%
    mutate(duration = end_date-start_date, 
                 extra_days = trunc(as.integer(duration)*.3),
                 breaks=c(2,4))

scales_y <- facet_params %>% 
    str_glue_data(
        "`{zone}` = scale_x_date(limits = c({as.Date(start_date)}, {as.Date(end_date)}), ", 
        "breaks = seq({as.Date(start_date)}, {as.Date(end_date)}, {breaks}))") %>%
    str_flatten(", ") %>% 
    str_c("list(", ., ")") %>% 
    parse(text = .) %>% 
    eval()

我不是这门语言的计算专家,但正如你提到的,这些日期没有被评估为正确的日期。错误信息似乎表明日期被解释为数学表达式2014-8-12=1994。为了解决这个问题,我将as.Date函数移到括号外,并在括号周围加上单引号。现在,日期评估为2014年8月12日,该日期可以视为合适的日期。我还用seq.Date替换了seq,但我不知道这是否绝对必要。下面的代码适用于我:

scales_x <- facet_params %>% 
  str_glue_data(
    "`{zone}` = scale_x_date(limits = c(as.Date('{start_date}'), as.Date('{end_date}')), ", 
    "breaks = seq.Date(as.Date('{start_date}'), as.Date('{end_date}'), {breaks}))"
  ) %>%
  str_flatten(", ") %>% 
  str_c("list(", ., ")") %>% 
  parse(text = .) %>% 
  eval()

library(facetscales)

ggplot(df, aes(date, Q)) +
  geom_line() +
  facet_grid_sc(~ zone, scales = list(x = scales_x))

有什么特别的原因让你喜欢他答案中的“语言计算”部分吗?在我看来,他的第一个代码块更容易实现。嗨,teunbrand,原因是我需要用“purr::pmap”以编程方式实现它,作为绘图过程的一部分。现在看看语法,这很有意义。非常感谢!