2016-03-16 10 views
7

最後の日に、私はアクティビティの期間を行としてプロットしたいと思います。 y軸はアクティビティの発生日を表し、x軸は時間を表します時間単位で 同じ日に始まり終わるアクティビティを扱うとき、これは簡単です。例えばggplot2で線としてのプロットの継続時間

df1<-structure(list(Date = structure(c(16802, 16803, 16805, 16806, 
16809, 16810, 16812, 16813, 16816, 16820, 16821, 16822, 16829 
), class = "Date"), hms1 = structure(c(1457623680, 1457620860, 
1457621160, 1457622540, 1457625600, 1457621280, 1457620380, 1457619720, 
1457623620, 1457621460, 1457620440, 1457617980, 1457621880), class =  c("POSIXct", "POSIXt"), tzone = ""), hms2 = structure(c(1457632500, 1457627640, 
1457628360, 1457629500, 1457631000, 1457625120, 1457625420, 1457624520, 
1457627640, 1457626800, 1457626800, 1457622060, 1457625540), class = c("POSIXct", 
"POSIXt"), tzone = "")), .Names = c("Date", "hms1", "hms2"), class =  "data.frame", row.names = c(103L, 105L, 108L, 110L, 114L, 117L, 120L, 122L, 127L, 135L, 136L, 138L, 145L)) 

p1<-ggplot(df1, aes(x=Date,y= hms1))+ scale_x_date(breaks = date_breaks("1 day"))+ 
geom_linerange(aes(ymin = hms1, ymax = hms2),color = "red",size = 2)+ coord_flip() 
p1+ylab("Time")+ggtitle("Activity During Day") 

が希望のプロットを与える:hms1mのhms2の日付が原因私はに使用されるプロセスに間違っている一方で、実際の日付は、列の日付であることを ggplot1

注意H:M:S形式で時間を取得します。

df1$hms1 <- format(df1$time, format = "%H:%M:%S") 
df1$hms1 <- as.POSIXct(df1$hms1, format = "%H:%M:%S") 

「アクティビティ」のほとんどは、私は2日間の期間にプロットをしようとしています。私が今までに思い付いた唯一の解決策は、 は、2に示唆されているように、同じ日に人工的に配置するために、両方の日時値を適切な期間だけシフトしています。 このプロセスでは、もちろん、x軸には「人工的な」タイムスタンプが表示されます。

どのように私はggplotの目盛りを制御することができるので、正しいタイムスタンプを表示させることができますか? 誰かがより洗練されたソリューションを提案できますか? 明確にする:y軸はイベントの開始日にしたいが、x軸は24時間以上にする。

+0

あなたはHMS1とhms2を計算するために使用している基礎となる値を含むデータサンプルを提供する場合あなたを助けるために容易になります。 – eipi10

+0

Df2は実際にはタイプミスで、修正されました。今、私は元のデータサンプルを含めることはできませんが、できるだけ早く完了します。 –

+0

あなたの望む結果がどのように見えるかはっきりしていません。 y軸をイベントの開始日にするだけですが、x軸は24時間以上にしますか?または、あるy-value-dateから次のy-value-dateまでの行を "折り返す"ようにしますか?他に何か? – Gregor

答えて

5

あなたの実際のデータ構造がどのようなものかわかりません。したがって、私はDateの値を使用し、runifを使用して各アクティビティのランダムな開始時間と終了時間を選択しました。いくつかの期間は単一の日付内に生じ、ある期間は2つの日付にまたがる。

次に、データを次のようにプロットしました。アクティビティの開始日に垂直に配置された水平線をプロットします。この行は、アクティビティーが開始された時間(時間単位)から開始されます(アクティビティーが開始された日付の真夜中を基準にして)。

水平スケールは48時間に拡張され、複数の日付をカバーするアクティビティーを視覚化することができます。縦線は日付の境界を示しているので、どのアクティビティが2日目に続きたかを見ることができます。 3日以上継続する活動がある場合は、必要に応じてそれに合わせて水平尺度を伸ばしてください。

# Convert Date to POSIXct and set HMS to beginning of day (i.e., Midnight). 
# To do this, I added 8-hours to account for my locale being the U.S. Pacific time zone. 
df1$Date = as.POSIXct(df1$Date) + 3600*8 

## Create some times for start and end of each activity 
set.seed(20) 
df1$hms1a = df1$Date + runif(nrow(df1), 3600*5, 3600*10) 
df1$hms2a = df1$Date + runif(nrow(df1), 3600*15, 3600*40) 

library(ggplot2) 
library(scales) 
library(stringr) 

ggplot(df1, aes(x=Date)) + 
    scale_x_datetime(breaks = date_breaks("1 day")) + 
    scale_y_continuous(limits = c(0,48), breaks=seq(0,48,2), 
        labels=str_pad(seq(0,48,2) %% 24, 2, pad="0")) + 
    geom_hline(yintercept=seq(0,48,24)) + 
    geom_linerange(aes(ymin = hms1a - Date, ymax = hms2a - Date), color = "red",size = 2) + 
    coord_flip() + ylab("Time (hours)") + 
    ggtitle("Activity During Day") 

enter image description here

+0

非常に賢く簡単な解決策。これはRでGanttの図を見るのも初めてのことです。 – PavoDive

関連する問題