在 scale_x_date 和 scale_x_date 时间之间选择的包装器

Wrapper to choose between scale_x_date and scale_x_datetime

由于 scale_x_date is for "date" and 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))
    }
}

这是可能的。但是由于在使用 + 时无法访问绘图数据(据我所知),我们必须使用 magrittr 管道来测试 class 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-09-13 创建