6

ggplot を使用して、さまざまなイベントを日付 (x 軸) と開始時刻 (y 軸) の関数としてプロットしています。データ/コードは次のとおりです。

date<-c("2013-06-05","2013-06-05","2013-06-04","2013-06-04","2013-06-04","2013-06-04","2013-06-04",
    "2013-06-04","2013-06-04","2013-06-03","2013-06-03","2013-06-03","2013-06-03","2013-06-03",
    "2013-06-02","2013-06-02","2013-06-02","2013-06-02","2013-06-02","2013-06-02","2013-06-02")
start <-c("07:36:00","01:30:00","22:19:00","22:12:00","20:16:00","19:19:00","09:00:00",
     "06:45:00","01:03:00","22:15:00","19:05:00","08:59:00","08:01:00","07:08:00",
     "23:24:00","20:39:00","18:53:00","16:57:00","15:07:00","14:33:00","13:24:00")
duration <-c(0.5,6.1,2.18,0.12,1.93,0.95,10.32,
         2.25,5.7,2.78,3.17,9.03,0.95,0.88,
         7.73,2.75,1.77,1.92,1.83,0.57,1.13)
event <-c("AF201","SS431","BE201","CD331","HG511","CD331","WQ115",
      "CD331","SS431","WQ115","HG511","WQ115","CD331","AF201",
      "SS431","WQ115","HG511","WQ115","CD331","AS335","CD331")

df<-data.frame(date,start,duration,event)

library(ggplot2)
library(scales)

p <- ggplot(df, aes(as.Date(date),as.POSIXct(start,format='%H:%M:%S'),color=event))
p <- p+geom_point(alpha = I(6/10),size=5) 
p + ylab("time (hr)") + xlab("date") + scale_x_date(labels = date_format("%m/%d")) +
scale_y_datetime(labels = date_format("%H"))+
scale_colour_hue(h=c(360, 90))
theme(axis.text.x = element_text(hjust=1, angle=0))  

結果のプロットは次のようになります。

ここに画像の説明を入力

質問:イベントの開始時刻を 1 つのポイント (上図) で示すだけでなく、イベントの期間全体にわたるバーをプロットするにはどうすればよいですか? 上記のデータ フレームに示すように、この期間データ (時間単位) があります。または、「停止時間」を指定することもできます (表示されていません)。

ソリューションは積み上げ棒グラフのようになると想像しています。ただし、棒グラフは、棒がプロットの下部から始まり、垂直に積み上げられたイベント間に隙間がないことを前提としているため、正確ではありません。私のイベントは、連続していない可能性があります。y 軸に沿ったさまざまな位置で「開始」および「停止」しています。ソリューションでは、1) 一部のイベントが最終的に同時発生する (時間が重複する) 可能性があること、および 2) 一部のイベントが複数日にまたがることも考慮する必要があります。

どんな提案にもとても感謝しています!

4

4 に答える 4

5

あなたが何を望んでいるのか正確には少し不明です-@ Micheleの答えは良さそうでした。使用したい場合はgeom_rect、線が太くなるため(そうであれば、線幅を変更するだけです)、または別の理由があるかどうかはわかりませんでした. geom_rect回避を有効にするために使用してみることにしました。x 軸に開始日、y 軸に開始時刻と終了時刻をプロットしました。それを可能にするために、データを少し異なる方法で設定しました。何か違うものを求めている場合は、それを明示するようにしてください。ただし、少なくとも別のオプションがあります。

df<-data.frame(date,start,duration,event)

df <- transform(df,
                start = as.POSIXct(paste(date, start)),
                end   = as.POSIXct(paste(date, start)) + duration*3600)

df <- df[c("event", "start", "end")]

df$date <- strptime(df$start, "%Y-%m-%d")
df$start.new <- format(df$start, format = "%H:%M:%S")
df$end.new <- format(df$end, format = "%H:%M:%S")
df$day <- factor(as.POSIXct(df$date))
levels(df$day) <- 1:4
df$day <- as.numeric(as.character(df$day))
df$event.int <- df$event
levels(df$event.int) <- 1:7
df$event.int <- as.numeric(as.character(df$event.int))

p <- ggplot(df, aes(day, start)) + geom_rect(aes(ymin = start, ymax = end,
                                            xmin = (day - 0.45) + event.int/10,
                                            xmax = (day - 0.35) + event.int/10,
                                            fill = event)) +
  scale_x_discrete(limits = 1:4,breaks = 1:4, labels = sort(unique(date)),
                   name = "Start date") + ylab("Duration")

ここに画像の説明を入力

于 2013-06-16T05:25:50.257 に答える
4

@Michele と @alexwhan のご意見に感謝 (+1) します。geom_rect を使用すると、x 軸の同じ​​ポイントで同じ日付に発生するすべてのイベントを取得できました。(このデータセットには、最終的には何ヶ月ものイベントが含まれる可能性があると予想しています。)

df<-data.frame(date,start,duration,event)

library(ggplot2)

p <- ggplot(df, aes(xmin=as.Date(date),xmax=as.Date(date)+1,
                    ymin=as.POSIXct(start,format='%H:%M:%S'),
                    ymax=as.POSIXct(start,format='%H:%M:%S')+duration*3600,
                    fill=event))
p <- p+geom_rect(alpha = I(8/10)) 
p + ylab("time") + xlab("date") + scale_x_date(labels = date_format("%m/%d")) +
scale_y_datetime(labels = date_format("%H"))+
scale_colour_hue(h=c(360, 90))
theme(axis.text.x = element_text(hjust=1, angle=0))   

...結果は次のとおりです。 ここに画像の説明を入力

これは私が目指していたものにかなり近いです。アルファを調整することで、潜在的なオーバープロットの問題に対処できると思います。理想的には、y 軸に 1 日 (00 から 00) だけを含めたいと思います。これを行うには、おそらく、真夜中を超える期間のイベントが翌日に再割り当てされるように、データを再フォーマットする必要があると思います。(Rでこれを行う方法がわからない。)

于 2013-06-16T15:53:14.467 に答える
3

この方法を試してください。おそらくあなたが計画したものとは異なりますが、データを表示するための非常に明確な方法だと思います:

df<-data.frame(date,start,duration,event)

df <- transform(df,
                start = as.POSIXct(paste(date, start)),
                end   = as.POSIXct(paste(date, start)) + duration*3600)

df <- df[c("event", "start", "end")]

library(reshape2)

df <- melt(df, id.vars="event")
df$value <- as.POSIXct(df$value, origin=as.Date("1970-01-01"))

df <- df[order(df$event, df$value),]

df$eventID <- rep(seq(1, nrow(df)/2, 1), each=2)

library(ggplot2)

ggplot(df) +
  geom_line(aes(value, event, group=eventID, color=event))

ここに画像の説明を入力

于 2013-06-15T09:02:13.273 に答える
1

次の利点を組み合わせる: (i) 単一の ~24 時間の期間を含む y 軸。(ii) イベントが重複しないこと。(iii) 凡例に加えて、グラフ内でラベル付けされたイベント。(iv) 簡潔なコード。

library(dplyr)
library(lubridate)

# Re-create data frame
df <- data_frame(date, start, duration, event) %>%
    mutate(start_dt = as.POSIXct(paste(date, start), tz = 'UTC'),
           start_hr = hour(start_dt),
           end_dt = start_dt + duration * 3600,
           end_hr = hour(end_dt) + (as.Date(end_dt) - as.Date(start_dt)) * 24)

# Plot
df %>% ggplot() +
    geom_segment(aes(x = event, y = start_hr, xend = event, yend = end_hr,
                     color = event, size = 1)) +
    facet_wrap(~ date, nrow = 1) +
    guides(size = 'none')

プロットの画像:

プロットのイメージ

于 2016-11-13T15:56:17.270 に答える