簡體   English   中英

R:使用ggplot2繪制時間序列中的每日數據集子圖

[英]R: using ggplot2 to plot daily dataset subfigure in a time series

我正在嘗試使用ggplot2繪制每日時間序列。

我的問題:

  1. 如何在一個圖形內生成每日時間序列的子圖(即,一個子圖具有一天(24小時)的時間序列)?
  2. 如何提取白天(08:00-17:59)和夜間(第二天18:00-07:59)的時間序列進行繪圖?
  3. 如何將時間刻度/標簽設置為3小時間隔?

時間序列如下所示:

  Sensor    Time
  -0.28     1-25-16 15:00
  -0.27     1-25-16 15:01
  -0.27     1-25-16 15:02
  -0.26     1-25-16 15:03
  -0.25     1-25-16 15:04
  -0.26     1-25-16 15:05
  -0.28     1-25-16 15:06
  -0.28     1-25-16 15:07
  -0.27     1-25-16 15:08
  -0.30     1-25-16 15:12
  -0.31     1-25-16 15:13
  -0.30     1-25-16 15:14
  -0.30     1-25-16 15:15
  -0.31     1-25-16 15:16
  -0.31     1-25-16 15:17
  -0.31     1-25-16 15:18
  -0.31     1-25-16 15:19
  -0.30     1-25-16 15:20
  -0.27     1-25-16 16:00
  -0.28     1-25-16 16:01
  -0.27     1-25-16 16:02
  -0.26     1-25-16 16:03
  -0.26     1-25-16 16:04
  -0.26     1-25-16 16:06

謝謝。

在時區,多年期,夏時制等方面正確地做到這一點實際上是非常棘手的。我已經做了很多。 這可以幫助您入門。

library(ggplot2)
library(lubridate)

addTimePanelVars <- function(df, stime, tvname="time", tzab = "US/Pacific", fdow = 0) {
    if (tvname != "time") {
        df$time <- df[[tvname]]
    }
    daysecs <- 24 * 60 * 60
    soy <- as.POSIXct(sprintf("%d-01-01 00:00:00", year(stime)), tz = tzab)
    dowsoy <- (as.POSIXlt(soy)$wday - fdow) %% 7
    df$dn <- as.POSIXlt(df$time)$yday
    df$dayFromStart <- as.numeric(difftime(as.Date(df$time, tz = tzab),
         as.Date(soy, tz = tzab), units = "days"))

    df$wn <- trunc(((df$dn + dowsoy)) / 7)
    df$cumwn <- trunc(((df$dayFromStart + dowsoy)) / 7)
    df$date <- as.Date(df$time,tz=tzab)
    df$wkrow <- trunc(df$cumwn / 4)
    df$wkcol <- trunc(df$cumwn %% 4)
    df$dow <- (as.POSIXlt(df$time)$wday - fdow) %% 7
    df$timedy <- (hour(df$time) + minute(df$time) / 60 + +second(df$time) / 3600) / 24
    df$timewk <- df$dow + df$timedy
    df$timehr <- df$timedy*24
    return(df)
}

set.seed(123)
n <- 60 * 24 * 18   # 18 days
tzab <- "US/Pacific"
stime <- as.POSIXct("2016-01-16 15:00:00", tz = tzab)
t <- seq(stime,by=60, length.out = n)
s <- rnorm(n,-0.3,0.02)
df <- data.frame(time = t, sensor = s)
df <- addTimePanelVars(df, stime, tz = tzab)
df$daytime <- ifelse(8 <= hour(df$time) & hour(df$time) < 18, "day", "night")

ggplot(df) +
   geom_point(aes(x = timehr, y = sensor, color = daytime)) +
   scale_x_continuous(breaks = 3 * 0:8) +
   scale_color_manual(values = c(day = "red", night = "blue")) +
   facet_wrap( ~ date )

產生這個:

在此處輸入圖片說明

不太確定您想如何處理白天/夜晚的事情。 例如,您可以將子集和白天和黑夜顯示為不同的數字。

但是請注意在變量addTimePanelVars也被設置為每周做面板,采用facet_grid(wkrow ~ wkcol) +

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM