2015-12-02 72 views
1

我正在使用facet_grid繪製我的時間序列數據。該數據是使用facet_grid/ggplot2移位一天的時間序列數據

> dput(mel.ob) 
structure(list(timestamp = structure(c(1438450200, 1438536600, 
1438623000, 1438709400, 1438795800, 1438882200, 1438968600, 1439055000, 
1439141400, 1439227800, 1439314200, 1439400600, 1439487000, 1439573400, 
1439659800, 1439746200, 1439832600, 1439919000, 1440005400, 1440091800, 
1440178200, 1440264600, 1440351000, 1440437400, 1440523800, 1440610200, 
1440696600, 1440783000, 1440869400, 1440955800, 1438450200, 1438536600, 
1438623000, 1438709400, 1438795800, 1438882200, 1438968600, 1439055000, 
1439141400, 1439227800, 1439314200, 1439400600, 1439487000, 1439573400, 
1439659800, 1439746200, 1439832600, 1439919000, 1440005400, 1440091800, 
1440178200, 1440264600, 1440351000, 1440437400, 1440523800, 1440610200, 
1440696600, 1440783000, 1440869400, 1440955800, 1438450200, 1438536600, 
1438623000, 1438709400, 1438795800, 1438882200, 1438968600, 1439055000, 
1439141400, 1439227800, 1439314200, 1439400600, 1439487000, 1439573400, 
1439659800, 1439746200, 1439832600, 1439919000, 1440005400, 1440091800, 
1440178200, 1440264600, 1440351000, 1440437400, 1440523800, 1440610200, 
1440696600, 1440783000, 1440869400, 1440955800), tzone = "Asia/Kolkata", tclass = c("POSIXct", 
"POSIXt"), class = c("POSIXct", "POSIXt")), variable = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("power", "hpanom", 
"lofanom"), class = "factor"), value = c(172.016104060554, 176.777480085691, 
184.018404140075, 175.561151940955, 182.52419107159, 175.216664665937, 
183.751597162088, 198.844153259955, 199.803173963254, 237.508030500042, 
285.079349749013, 188.377162014776, 452.238984323895, 304.084650686052, 
304.976941431231, 168.37194477982, 221.142072661718, 285.339264474312, 
243.126828978721, 526.165040140682, 583.26909929249, 549.145660841621, 
195.02748863608, 200.088289825199, 249.279407493724, 410.968041439378, 
368.949028046264, 361.528117646774, 394.092273548577, 439.027137154341, 
0.190453461153838, 0.738170304350057, 0.359277651161948, 0.383363598976019, 
0.357189854750563, 0.357189854750563, 0, 0.464407941461156, 0.842226206120729, 
0.928056670115148, 0.939184368487052, 0.174074829364281, 0.999333003990622, 
0.97052094947291, 0.957985395010343, 0.620128340774666, 0.971218262867733, 
0.918581736843709, 0.898790693128374, 0.992626480647862, 0.996099376857962, 
0.995219939905799, 0.864283999224187, 0.903098686478643, 0.929581519648184, 
0.98981186152571, 0.986686711459769, 0.989957071504958, 0.984688509451126, 
0.986320878558335, 0.02, 0.1, 0.03, 0.02, 0.07, 0.02, 0, 0.04, 
0.05, 0.45, 0.11, 0.01, 1, 0.1, 0.13, 0.03, 0.72, 0.13, 0.59, 
0.54, 0.72, 0.52, 0.08, 0.07, 0.14, 0.2, 0.15, 0.15, 0.17, 0.18 
)), row.names = c(NA, -90L), .Names = c("timestamp", "variable", 
"value"), class = "data.frame") 

我使用下面的代碼繪製

f <- ggplot(data=mel.ob,aes(x=timestamp,y=value,ymin=0,ymax=value))+facet_grid(variable~., scales = "free_y")+ 
    theme(axis.title.x=element_blank(),axis.title.y=element_blank()) 
f1 <- f + geom_linerange(subset=.(variable=="hpanom")) # require(plyr) for dot function 
f2 <- f1 + geom_linerange(subset=.(variable=="lofanom")) 
f3 <- f2 + geom_line(subset=.(variable=="power")) 
f3 

上標出我得到下面的圖形 enter image description here

所以,問題是我的數據集包含日期8月1日的數據到8月30日,但情節顯示8月2日至8月31日的數據。爲什麼以及我的數據集如何轉移一天?我在哪裏做錯了?

回答

4

情節實際上並沒有改變你的日期。您的日期採用POSIXct格式,包括小時,分鐘和秒鐘。 ggplot2將每個點放在每個日期確切的小時/分鐘/秒。你所有的時間都是23個小時。所以,8月3日看起來像是在8月2日的23小時。同樣,最左邊的一行是8月1日的23小時。

如果展開圖形的水平範圍並仔細觀察,您會發現主要網格線上的垂直線每個都稍微(即1小時)左右移動到主要網格線的左側在每天的午夜。

通過在代碼中使用as.Date(timestamp),您可以按天繪製點(不考慮小時)。另一種選擇是保持日期/時間格式,但將主要網格線放在所需的位置。例如,這裏是你將如何把每星期網格線開始於8月1日23:00小時,但設置標籤只是沒有時間日期:

f3 + scale_x_datetime(breaks=seq(min(mel.ob$timestamp), max(mel.ob$timestamp), 
           by="1 week"), 
         labels=as.Date(seq(min(mel.ob$timestamp), max(mel.ob$timestamp), 
            by="1 week"))) 

只是作爲一個附加的註釋,日期/ R中的時間格式實際上只是添加了日期/時間類的數字變量。類POSIXct是自1970年1月1日00:00:00(在UTC時區)以來的秒數,而類Date是自1970年1月1日以來的天數。 ggplot正在繪製這些數值,但是有適合相應日期類別的中斷和標籤。您可以通過執行as.numeric(mel.ob$timestamp)as.numeric(as.Date(mel.ob$timestamp))來查看基礎數值。