【问题标题】:change part of time x axis labels in ggplot在ggplot中更改部分时间x轴标签
【发布时间】:2014-08-16 11:16:58
【问题描述】:

我有这样的数据框:

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")

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

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

【问题讨论】:

  • 我认为在 29 小时制时钟上表示日期不会很幸运!你为什么这样做?
  • 我猜你可以用数字向量替换time..
  • 这是电视广播标准。广播从05:00开始,到次日4:59结束。电视购买者可以方便地使用 5:00:00 - 28:59:59 时间格式进行广告。

标签: r time ggplot2 axis


【解决方案1】:

如果您创建了一个新的格式化程序来计算自某一天/时间以来的小时/分钟,例如

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")

【讨论】:

  • 我怀疑我的怀疑是没有根据的。干得好!
  • 我添加了进一步的描述,我还添加了一个不需要明确开始日期的备用格式化程序。
猜你喜欢
  • 2019-04-03
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
相关资源
最近更新 更多