2013-05-18 32 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! –