【问题标题】:Defining first axis break point for datetime using R's ggplot2使用 R 的 ggplot2 定义日期时间的第一个轴断点
【发布时间】:2024-04-25 05:55:02
【问题描述】:

我有从 01:30:00(01:30 AM)开始的 12 小时的时间序列数据。

我想要 2 小时的主要休息时间和 1 小时的次要休息时间。

我使用 ggplot2 和 scale_x_datetime 来设置中断和 date_minor_breaks

默认情况下,我会有以下主要休息时间:03AM、05AM、07AM、09AM、11AM。
我更喜欢这些重要的休息时间:凌晨 2 点、凌晨 4 点、早上 6 点、早上 8 点、早上 10 点

似乎可以手动设置中断向量,但我不确定如何为日期时间数据类型执行此操作。
我还以为我可以通过指定第一个主要刻度线(第一个中断)来覆盖默认值,然后“中断”可以填写其余部分。
我宁愿避免对中断向量进行硬编码,因为此代码需要可重用(对于具有不同开始时间的数据集)。

#quick sample data set
DF_test <- data.frame(matrix("NA", ncol = 2, nrow = 6))
DF_test$TS <- as.POSIXct(
            c("2017/01/01 01:30:00", 
            "2017/01/01 03:40:00", 
            "2017/01/01 05:10:00", 
            "2017/01/01 07:05:00", 
            "2017/01/01 09:25:00", 
            "2017/01/01 11:00:00"
            ),
            tz="UTC",origin="1970-01-01",usetz=F)
DF_test$value <- c(50,51,45,50,57,49)

#Create plot
ggplot(DF_test) +
    scale_x_datetime(breaks = date_breaks("2 hour"),
                     date_minor_breaks = "1 hour",
                     labels = date_format("%I\n%p")) +
    geom_line(aes(TS, value))

样本数据图:

如果您有兴趣 - 最终目标:

情节有 4 小时的主要休息时间

【问题讨论】:

    标签: r datetime ggplot2 axis-labels posixct


    【解决方案1】:

    您可以使用seq.POSIXt() 从最小到最大POSIXct 生成使用by = "2 hour" 的x 轴标签。然后使用lubridate::ceiling_date 将其四舍五入到下一个小时。这是想要的输出吗?

    library(ggplot2)
    library(scales)
    library(lubridate)
    ggplot(DF_test) +
    scale_x_datetime(breaks = seq.POSIXt( ceiling_date(min(DF_test$TS), unit = "hour"),
                                          ceiling_date(max(DF_test$TS), unit = "hour"), by = "2 hour" ),
                                          labels = date_format("%H:%M %p") ) +
    geom_line (aes(TS, value))
    

    关于您的最终目标,只需将by 参数中的"2 hour" 替换为"4 hour"

    【讨论】:

      最近更新 更多