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

BiX*_*XiC 2 time axis r ggplot2

我有这样的数据框:

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)
Run Code Online (Sandbox Code Playgroud)

我做了ggplot d

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

在此输入图像描述

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

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

MrF*_*ick 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))
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上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")
Run Code Online (Sandbox Code Playgroud)

应该给你你想要的标签.

既然我已经阅读了你为什么要这样做,我创建了一个备用函数,如果你的数据跨越多个日期,你可能希望使用它

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

ggplot(data = d, aes(time,variable)) + 
  geom_point() +
  scale_x_datetime(labels = tvtime_format(), breaks = "1 hour")
Run Code Online (Sandbox Code Playgroud)