Оси тики и метки для времени с базой R - PullRequest
0 голосов
/ 12 декабря 2018

Я ищу поведение, подобное

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 голосов
/ 14 декабря 2018

В пакете есть roundPOSIXt функция datetimeutils (которую я поддерживаю).Он может делать то, что вы хотите.

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"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...