2014-01-22 67 views
3

在ggplot軸中使用POSIX的最聰明的方法是什麼?R - ggplot2 - 如何在POSIX軸上使用限制?

我正在嘗試創建一個函數,用於繪製橫跨週期的許多圖形(每天一個),對x軸使用POSIX時間。

爲此,我創建了一個額外的整數列DF$Day與我一起輸入該函數。然後,我使用那天創建一個子集,我使用ggplot2進行繪圖。我想到如何使用scale_x_datetime來格式化POSIX x軸。基本上,我只顯示時間&分鐘,省略了日期。

這是我的問題:如何設置每個小時的每個圖表的限制?

下面是一些工作,可重複的代碼來獲得一個想法。它創建第一天,顯示它爲3秒&創建第二天的收益。但是,每個天限都是根據time變量的範圍來選擇的。例如,我怎樣才能使範圍,整天(0小時 - 24小時)?

DF <- data.frame(matrix(ncol = 0, nrow = 4)) 

DF$time <- as.POSIXct(c("2010-01-01 02:01:00", "2010-01-01 18:10:00", "2010-01-02 04:20:00", "2010-01-02 13:30:00")) 
DF$observation <- c(1,2,1,2) 
DF$Day <- c(1,1,2,2) 

for (Individual_Day in 1:2) { 
Day_subset <- DF[DF$Day == as.integer(Individual_Day),] 

print(ggplot(data=Day_subset, aes_string(x="time", y="observation")) + geom_point() + 
     scale_x_datetime(breaks=("2 hour"), minor_breaks=("1 hour"), labels=date_format("%H:%M"))) 

Sys.sleep(3) } 

Second plot created by the function, to show the axis

+0

而不是打印圖形和使用'Sys.sleep()',你可能想看看'動畫'包。 ['saveHTML'](http://www.inside-r.org/packages/cran/animation/docs/saveHTML)函數帶有一個不錯的「播放器」,可讓您逐幀瀏覽或調整播放速度在瀏覽器中。您還可以保存GIF或其他格式。 – Gregor

+0

@shujaa我一定會檢查一下。我實際上爲這個問題搜索了'sys.sleep()',通常我只保存爲PDF。假設這會使發佈更容易;感謝您的建議:) –

回答

3

好了,這裏有一個方法。

# ... 
for (Individual_Day in 1:2) { 
Day_subset <- DF[DF$Day == as.integer(Individual_Day),] 
lower <- with(Day_subset,as.POSIXct(strftime(min(time),"%Y-%m-%d"))) 
upper <- with(Day_subset,as.POSIXct(strftime(as.Date(max(time))+1,"%Y-%m-%d"))-1) 
limits = c(lower,upper) 

print(ggplot(data=Day_subset, aes(x=time, y=observation)) + 
     geom_point() + 
     scale_x_datetime(breaks=("2 hour"), 
          minor_breaks=("1 hour"), 
          labels=date_format("%H:%M"), 
          limits=limits) 
    ) 
} 

lower的計算需要的最小時間在所述子集,並將其與僅日期部分脅迫到字符(例如,除掉的時間部分)。轉換回POSIXct會生成當天的開始。

upper的計算稍微複雜一點。您必須將最大時間轉換爲日期值並加1(例如1天),然後轉換爲字符(剝離時間部分),轉換回POSIXct並減1(例如1秒)。這會在結束的日子生成23:59。

巨大的工作量,這樣一個小事情。我希望別人發佈一個更簡單的方法來做到這一點...

+0

這工作正常。我開始懷疑使用POSIX繪圖,但它太複雜了。我首先依賴於一個額外的Vector,在那裏我在小時/分鐘之外完成了整數,並且只繪製了該數值向量。我試圖POSIX希望它會更優雅,但相反似乎是真的... –

+0

@Hegazy你可能想取消接受這個答案。我也很感興趣,正如jlhoward所說:「我希望別人發佈一個更簡單的方法來做到這一點......」。給它幾天,然後如果沒有人發佈一個更簡單的答案,接受這一個。但如果它被標記爲接受,這個問題就不會引起太多關注。 – Gregor

+0

同意。 SO的約定是在等待至少24小時後才能接受答案(當然假設它解決了你的問題)。有關一些準則,請參閱[此鏈接](http://stackoverflow.com/help/someone-answers)。 – jlhoward

相關問題