我有这样的数据框:
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
library(ggplot2)
library(scales)
ggplot(data = d, aes(time,variable)) +
geom_point() +
scale_x_datetime(labels = date_format("%H:%M"),breaks = "1 hour")
我希望从00:00到05:00更改x轴标签的一部分 而不是这个x轴标签我想要24:00到29:00。
是否可以使用scale_x_datetime函数执行此操作,或者可能与它类似?
答案 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")