这是可能的。但是由于您在使用+ 时无法访问绘图数据(据我所知),我们必须使用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 日创建