【问题标题】:Wrapper to choose between scale_x_date and scale_x_datetime在 scale_x_date 和 scale_x_datetime 之间选择的包装器
【发布时间】:2020-01-15 06:16:45
【问题描述】:

由于scale_x_date 用于“日期”,scale_x_datetime 用于“POSIXct”, 是否可以有一个包装器来自动决定选择两者中的哪一个,因为两者甚至具有相同的函数参数。

与此类似,但其论点(数据)取自我的几何学的美学:

scale_x_date_flex <- function(date_labels = "%B",date_breaks = "months")){

    if(any(class(DF$Date) =="POSIXct")){
        return(scale_x_datetime(date_labels = date_labels ,date_breaks = date_breaks))
    }else{
        return(scale_x_date(date_labels = date_labels ,date_breaks = date_breaks))
    }
}

【问题讨论】:

    标签: r date ggplot2 posixct


    【解决方案1】:

    这是可能的。但是由于您在使用+ 时无法访问绘图数据(据我所知),我们必须使用magrittr 管道来测试x 美学的类。

    功能

    scale_x_date_flex <- function(plot,
                                  date_labels = "%B", 
                                  date_breaks = "months") {
    
      if ("POSIXct" %in% class(plot$data[[quo_name(plot$mapping$x)]])) {
        message("scale_x_datetime")
        return(plot + scale_x_datetime(date_labels = date_labels, date_breaks = date_breaks))
      } else {
        message("scale_x_date")
        return(plot + scale_x_date(date_labels = date_labels, date_breaks = date_breaks))
      }
    
    }
    

    示例

    library(ggplot2)
    library(magrittr)
    
    last_month_date <- Sys.Date() - 0:29
    last_day_time <- Sys.time() - 0:29 * (60 * 60)
    
    df <- data.frame(
      date = last_month_date,
      time = last_day_time,
      price = runif(30)
    )
    
    
    base_d <- ggplot(df, aes(date, price)) +
      geom_line()
    
    base_t <- ggplot(df, aes(time, price)) +
      geom_line()
    
    
    
    base_d %>% scale_x_date_flex(date_labels = "%d", date_breaks = "5 days")
    #> scale_x_date
    

    base_t %>% scale_x_date_flex(date_labels = "%d %H:%M", date_breaks = "5 hour")
    #> scale_x_datetime
    

    但您仍然可以在ggplot 命令链的中间使用它。所以这会起作用:

    base_d %>% scale_x_date_flex(date_labels = "%d", date_breaks = "5 days") + theme_bw()
    

    reprex package (v0.3.0) 于 2019 年 9 月 13 日创建

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 2011-07-14
      • 2016-05-02
      • 1970-01-01
      • 2021-10-20
      相关资源
      最近更新 更多