2013-05-18 28 views
1

我想繪製緯度與經度,並通過日期和時間連接點,這些點存儲在POSIXlt類的對象中。我有很多很多的GPS點,但是這裏有一小部分我想用ggplot2來繪製。使用ggplot2,通過第三個變量連接x座標和y座標

我的數據是,像這樣:

Description    lat   lon 
6/16/2012 17:22   12.117017 -89.69692 
6/17/2012 9:15   12.1178  -89.69675 
6/17/2012 9:33   12.117783 -89.69673 
6/17/2012 10:19   12.11785 -89.69665 
6/17/2012 10:45   12.11775 -89.69677 
6/17/2012 11:22   12.1178  -89.69673 
6/17/2012 11:39   12.117817 -89.69662 
6/17/2012 11:59   12.117717 -89.69677 
6/17/2012 12:10   12.117717 -89.69655 
6/16/2012 16:38   12.11795 -89.6965 
6/16/2012 18:29   12.1178  -89.69688 
6/16/2012 17:11   12.117417 -89.69703 
6/16/2012 17:36   12.116967 -89.69668 
6/16/2012 17:50   12.117217 -89.69695 
6/16/2012 18:02   12.117583 -89.69715 
6/16/2012 18:15   12.11785 -89.69665 
6/16/2012 18:27   12.117683 -89.69632 

我有地圖,我繪製這些點上。

我可以積點就好了

plot1 <- map + geom_point(data=dat, aes(x = lon, y = lat)) 

地圖是一個對象,我ggmap製成,但它不是那麼重要的,包括在這裏。 下面的代碼產生連接點爲lon增加

plot1+geom_line(data=dat, aes(x=lon,y=lat,colour="red")) 

我不能找出如何由矢量POSIXlt對象的點的連線Description 我知道在這個小例子我可以很容易重新排列的點使用類似dat2 <- dat[with(dat, order(Description)), ]和改造plot1使用dat2和使用下面的代碼進行所需的情節:

plot1+geom_path(data=dat2, aes(x = lond, y = latd, colour="red")) 

但對我大得多(幾十萬觀察)數據集,這並不活動把它作爲一種解決方案,而不需要更多的工作來恰當地標識每個觀察結果,而作爲額外的數據探索的一部分,我最終還是會做最後的工作。 有沒有在geom_line中發現的一個論據來告訴R如何連接點?

我當然還是使用ggplot2的新手,所以,如果我錯過了很簡單的東西,我很抱歉。我一直在研究其他許多代碼,並學習或至少使用其他幾個軟件包來處理其他空間數據。這一切都有點壓倒性......很多想法,很少的知識!其中較大的一點是可視化(並最終分析)我的研究生物體的運動模式和空間使用情況,但現在,以各種方式可視化數據以真正熟悉數據將是非常好的。

如果您有任何建議使用空間數據和GPS數據的軟件包,我也很樂意聽到他們的消息。

+1

的[** CRAN任務視圖:空間數據**](HTTP:// CRAN 1,1'- project.org /網頁/視圖/空間。html)會告訴你所有你需要知道的(有爭議的!)關於在R中用於空間數據的包。 –

回答

2

您需要按日期/時間對象排序的行才能使用geom_path。因爲我認爲這是顯示數據的最佳方式,所以我們應該集中精力找到排序大型數據集的有效方法。很明顯,您可以瞭解您正在使用的數據集的規模。數百萬行?億萬也許?!

幸運的是data.table包確實做得非常好。下面是一個100萬行的表格,其中包含一個ID列X(表格最初的排序方式),一個1秒觀測值的未分類時間列和x和y的兩個隨機列,它們在我的筆記本電腦上需要< 1秒T按按日期/時間:

set.seed(123) 
require(data.table) 

# Rows ordered on X, random order of unique date/time values of 1 second observations 
df <- data.frame(ID = seq.int(1e6) , Desc = as.POSIXct(sample(1e6),origin=Sys.Date()) , x = runif(1e6) , y = runif(1e6)) 
head(df) 
# ID    Desc   x   y 
#1 1 2013-05-25 02:39:39 0.2363783 0.1387404 
#2 2 2013-05-25 23:58:17 0.1192702 0.1284918 
#3 3 2013-05-21 17:41:57 0.8599183 0.6301114 
#4 4 2013-05-23 16:12:42 0.8089243 0.7919304 
#5 5 2013-05-21 08:17:28 0.8197109 0.4568693 
#6 6 2013-05-22 17:57:23 0.4611204 0.5358536 
# Convert to data.table 
DT <- data.table(df) 

# Sort on 'Desc' 
setkey(DT , Desc) 
head(DT) 
#   ID    Desc   x   y 
#1: 544945 2013-05-18 01:00:01 0.7052422 0.52030877 
#2: 886165 2013-05-18 01:00:02 0.2256636 0.04391553 
#3: 893690 2013-05-18 01:00:03 0.1860687 0.30978506 
#4: 932276 2013-05-18 01:00:04 0.6305562 0.65188810 
#5: 407622 2013-05-18 01:00:05 0.5355992 0.98146120 
#6: 138936 2013-05-18 01:00:06 0.5999025 0.81722902 


# Make data.frame to from this to use with ggplot2 (not sure if you can't just use the data.table directly) 
df2 <- DT 

所以你的情況,你可以嘗試這樣的:

datDT <- data.table(dat) 
setkey(datDT , Description) 
dat2 <- datDT 
+0

'data.table'從'data.frame'繼承,所以你應該*能夠直接使用它。如果有任何函數,在這種情況下'ggplot'沒有'data.table'的方法,那麼它將默認使用'data.frame()'的方法。嘗試運行'str(dt')或'class(dt)'以查看data.frame()和data.table()都存在。 – Chase

+0

@Frank'setkey'採用未加引號的列名稱。 'setkeyv'可以對多個列名進行排序,但它需要帶引號的字符向量,而不是未加引號的列表。所以如果使用'setkeyv'使用'setkeyv(datDT,「Description」)。但是,如果您只是在一列上訂購,只需使用'setkey(datDT,Description)'。您必須對點進行排序,因爲它會逐行繪製點並根據行順序在它們之間加入一條線。 HTH! –