在 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 创建
由于 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 创建