我正在寻找与
类似的行为scale_x_datetime(labels=date_format("%H:%M", tz="UTC"),
breaks=date_breaks(breaks))
在ggplot中具有“ 5分钟”,“ 30分钟”,“ 1小时”等任何中断类型,用于基准R图。
我目前正在使用
f <- function(x) as.POSIXct(levels(cut(x, breaks)))
axis(1, at=f(data$Time), labels=format(f(data$Time), "%H:%M"))
但是结果并不总是很漂亮,这取决于数据时间值。 例如,有时每隔5分钟,刻度/标签可能是9:01、9:06、9:11,...而不是9:00、9:05、9:10……我的目标是我用ggplot得到了什么。
有人对此有很好的解决方案吗?
示例:
library("ggplot2")
N <- 3e3
time <- seq(as.POSIXct("2018-12-12 8:51:43 UTC", tz="UTC"), length.out=N, by="1 sec")
data <- data.frame(Time=time, Value=rnorm(N))
breaks <- "5 mins"
# base
plot(x=data$Time, y=data$Value, xaxt="n")
f <- function(x) as.POSIXct(levels(cut(x, breaks)))
axis(1, at=f(data$Time), labels=format(f(data$Time), "%H:%M"))
# ggplot
p <- ggplot(data) + geom_point(aes(x=Time, y=Value)) +
scale_x_datetime(labels=date_format("%H:%M", tz="UTC"),
breaks=date_breaks(breaks))
p
答案 0 :(得分:1)
软件包datetimeutils
中有一个函数roundPOSIXt
(我维护)。它可能会做您想要的。
library("datetimeutils")
roundPOSIXt(Sys.time(), interval = "10 min", up = FALSE)
## [1] "2018-12-14 10:40:00 CET"
roundPOSIXt(Sys.time(), interval = "10 min", up = TRUE)
## [1] "2018-12-14 10:50:00 CET"
因此,您的示例:
N <- 3e3
time <- seq(as.POSIXct("2018-12-12 8:51:43 UTC", tz = "UTC"),
length.out = N, by = "1 sec")
data <- data.frame(Time = time, Value = rnorm(N))
fmt <- function(x, breaks)
unique(roundPOSIXt(x, "5 mins"))
plot(x = data$Time, y = data$Value, xaxt = "n")
axis(1, at = fmt(data$Time),
labels = format(fmt(data$Time), "%H:%M"))