3

一部のワークステーションでエピソードの長さを測定しています。エピソードの開始と終了のタイム スタンプがあります。Y 軸が時刻、X 軸が観測日であるプロットを作成したいと思います。これを達成する方法はありますか?

たとえば、私は

    id  start               end
    1   01/01/2010 10:00:00 02/01/2010 22:00:00
    1   04/01/2012 08:00:00 04/01/2012 14:00:00

そして、添付のようなプロットを構築したいと思います

プロット

これを達成する方法はありますか?添付のグラフとは異なり、グラフの精度・表現を細かくしたい。

どうもありがとう

4

1 に答える 1

4

まず、サンプル データは再現できません。日付は日/月/年であると想定していますが、表示されているように見分けるのは困難です。また、 では日付の型が特殊Rなので、自分がどの型を持っているかを知っておくことが重要です。まず、同様の再現可能なデータセットを作成します。

DF <-
structure(list(id = c(1L, 1L), start = structure(c(1262340000, 
1262592000), class = c("POSIXct", "POSIXt"), tzone = "GMT"), 
    end = structure(c(1262469600, 1262613600), class = c("POSIXct", 
    "POSIXt"), tzone = "GMT")), .Names = c("id", "start", "end"
), row.names = c(NA, -2L), class = "data.frame")

次のように見えます

> DF
  id               start                 end
1  1 2010-01-01 10:00:00 2010-01-02 22:00:00
2  1 2010-01-04 08:00:00 2010-01-04 14:00:00

さて、これを描くには、いくつかの変換を行う必要があります。日付と時刻は、異なる軸にプロットされているため、分割する必要があります。

library("chron")
library("plyr")
DF$start.day <- as.Date(DF$start)
DF$end.day <- as.Date(DF$end)
DF$start.time <- as.chron(DF$start) - floor(as.chron(DF$start))
DF$end.time <- as.chron(DF$end) - floor(as.chron(DF$end))

また、日付は経過日に変換する必要があります。

t0 <- min(DF$start.day, DF$end.day)-1
DF$start.monitored.day <- as.numeric(DF$start.day - t0)
DF$end.monitored.day <- as.numeric(DF$end.day - t0)

最後に、午前 0 時を過ぎた期間を複数の範囲に分割して、各範囲が特定の日に含まれるようにする必要があります。このステップはそれほど単純ではありません。

DF$index <- seq_len(nrow(DF))
DF <- ddply(DF, .(index), function(df) {
  if(df$start.monitored.day == df$end.monitored.day) {
    df 
  } else {
    data.frame(start.monitored.day = df$start.monitored.day : df$end.monitored.day,
               end.monitored.day = df$start.monitored.day : df$end.monitored.day,
               start.time = c(df$start.time, rep(times("00:00:00"), df$end.monitored.day-df$start.monitored.day)),
               end.time = times(c(rep(times("23:59:59"), df$end.monitored.day-df$start.monitored.day), df$end.time)),
               id = df$id,
               index = df$index)
  }
})

これで、データはプロットできる形式になりました。

> DF[c("start.monitored.day", "end.monitored.day", "start.time", "end.time")]
  start.monitored.day end.monitored.day start.time end.time
1                   1                 1   10:00:00 23:59:59
2                   2                 2   00:00:00 22:00:00
3                   4                 4   08:00:00 14:00:00

これを使用ggplotして描画するのは、これに慣れているためであり、時間スケールで以前の作業を行ったことがあるためです。

そのブログ投稿からの抜粋

library("ggplot2")
library("scales")
timesreverse_trans <- function() {
    trans <- function(x) {-as.numeric(x)}
    inv <- function(x) {times(-x)}
    fmt <- function(x) {
        notone <- x != 1
        simplify <- !any(diff(x) < 1/(24*60))
        ifelse(notone, 
               format(x-floor(x), simplify=simplify),
               ifelse(simplify, "24:00", "24:00:00"))
    }
    trans_new("chrontimes-reverse",
              transform = trans,
              inverse = inv,
              breaks = pretty_breaks(),
              format = fmt,
              domain=c(0,1))
}
scale_y_times <- function(..., trans=NULL) {
    scale_y_continuous(..., trans=timesreverse_trans())
}

実際のプロットを残すだけです

ggplot(DF) +
  geom_rect(aes(xmin = start.monitored.day - 0.5,
                xmax = start.monitored.day + 0.5, 
                ymin = start.time,
                ymax = end.time)) +
  scale_y_times("Time") +
  scale_x_continuous("Monitored day")

ここに画像の説明を入力

于 2012-09-14T22:36:47.787 に答える