使用R> ggplot2为datetime定义第一个轴断点

时间:2017-05-03 04:46:38

标签: r datetime ggplot2 axis-labels posixct

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

我喜欢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))

样本数据图:

enter image description here

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

4小时重大休息时间

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以使用seq.POSIXt()从最小POSIXct到最大by = "2 hour"来使用lubridate::ceiling_date生成x轴标签。然后使用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

enter image description here

关于您的最终目标,只需在"2 hour" <{1}} "4 hour" if(hitFlag==true){ System.out.println("we hit em at "+(char)colGuess+rowGuess+" chief!"); } else { System.out.println("sorry chief we missed em"); } 中替换 if(hitFlag==true){ System.out.println("we hit em at "+(char)colGuess+rowGuess+" chief!"); } else { System.out.println("sorry chief we missed em at " + (char)colGuess+rowGuess); }