在ggplot中更改部分时间x轴标签

时间:2014-06-25 18:52:20

标签: r time ggplot2 axis

我有这样的数据框:

d <- data.frame(time = seq(as.POSIXct("01.01.2014 05:00:01",
                                  format = "%d.%m.%Y %H:%M:%S"),
                       as.POSIXct("02.01.2014 05:00:00",
                                  format = "%d.%m.%Y %H:%M:%S"),
                       length.out = 1440))
d$variable <- rnorm(1440)

我制作了d

的ggplot
library(ggplot2)
library(scales)
ggplot(data = d, aes(time,variable)) + 
  geom_point() +
  scale_x_datetime(labels = date_format("%H:%M"),breaks = "1 hour")

enter image description here

我希望从00:00到05:00更改x轴标签的一部分 而不是这个x轴标签我想要24:00到29:00。

是否可以使用scale_x_datetime函数执行此操作,或者可能与它类似?

1 个答案:

答案 0 :(得分:5)

如果您创建了一个新的格式化程序,该格式化程序计算了某个日期/时间之后的小时/分钟,例如

hmsince_format <- function(since) {
    function(x) {
        dt<-as.numeric(difftime(x, since, units="mins"))
        sprintf("%02d:%02d", as.integer(dt %/% 60), as.integer(dt %% 60))
    }
}

基本上hmsince()是工厂样式函数,它将返回标签格式化函数。 ggplot会将用作轴标记的日期通过x传递给此内部函数。然后,我们从保留在范围内的since日期中减去这些日期,因为我们的函数嵌套在工厂中。然后我们相互减去两个日期,并将它们格式化为小时:分钟。

然后你可以做

sinceDate <- as.POSIXct("01.01.2014 00:00:00", format = "%d.%m.%Y %H:%M:%S")
ggplot(data = d, aes(time,variable)) + 
  geom_point() +
  scale_x_datetime(labels = hmsince_format(sinceDate ), breaks = "1 hour")

应该为您提供您所追求的标签。

现在我已经了解了你为什么要这样做,我创建了一个备用功能,如果您的数据跨越多个日期,您可能希望使用该功能

tvtime_format<-function() {
    function(x) {
        v<-character(length(x))
        notNA<-!is.na(x)
        lt <- as.POSIXlt(x[notNA])
        hour <- lt$hour
        hour[hour<5] <- hour[hour<5]+24
        min <- lt$min
        v[notNA]<-sprintf("%02d:%02d", hour, min)
        v
    }
}

这里不需要传递任何特定日期来用作锚点。它只会增加24到小于5小时。(在这种情况下我真的不需要嵌套函数,但是我保持这种方式,所以方法类似。)这就像

一样使用
ggplot(data = d, aes(time,variable)) + 
  geom_point() +
  scale_x_datetime(labels = tvtime_format(), breaks = "1 hour")