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函数执行此操作,或者可能与它类似?
如果你创建了一个新的格式化程序,它计算了自特定日期/时间以来的小时/分钟
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)
| 归档时间: |
|
| 查看次数: |
2181 次 |
| 最近记录: |