轴刻度和标签以R为基础的时间

时间:2018-12-12 08:40:50

标签: r datetime ggplot2 plot

我正在寻找与

类似的行为
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

1 个答案:

答案 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"))