使用ggplot2,通过第三个变量连接x和y坐标

时间:2013-05-18 22:25:01

标签: r ggplot2 geospatial

我想绘制纬度与经度,并通过日期和时间连接点,我存储在POSIXlt类的对象中。我有很多很多GPS点,但这里有一小部分我想用ggplot2绘制。

我的数据是这样的:

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))  

map是我用ggmap制作的一个对象,但是包含在这里并不重要。 以下代码生成连接点的行,lon增加

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

我无法弄清楚如何通过矢量POSIXlt对象Description连接点 我知道在这个小例子中,我可以使用dat2 <- dat[with(dat, order(Description)), ]之类的东西轻松地对点进行重新排序,并使用dat2重新绘制plot1,并使用以下代码制作所需的绘图:

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

但是对于我的更大(数十万个观测值)数据集,这对于没有更多工作来正确识别每个观察点的解决方案来说没有意义,我肯定最终会做其他数据的一部分勘探。 是否有一个我在geom_line中没有发现的论据告诉R如何连接点?

我当然仍然是使用ggplot2的新手,所以,如果我错过了一些非常简单的事情,我道歉。我一直致力于许多其他代码和学习,或者至少使用其他几个软件包来处理这些GPS数据,以及其他可用的空间数据。这一切都有点压倒......很多想法,所以知识寥寥!更重要的是通过我的研究生物可视化(并最终分析)运动模式和空间的使用,但是现在,以各种方式可视化数据以真正熟悉它将是很棒的。

如果您有任何推荐的套餐用于处理空间数据和GPS数据,我也很乐意听到它们。

1 个答案:

答案 0 :(得分:2)

您需要按日期/时间对象排序的行才能使用geom_path。由于我认为这是显示数据的最佳方式,因此我们应该专注于找到一种对大型数据集进行排序的有效方法。显然,了解您正在使用的数据集的规模会很好。数百万行?也许数十亿?!

幸运的是data.table包确实做得非常好。这是一个100万行表的例子,其中一列是最初排序的ID列X,一个观察时间为1秒的未排序时间列,另外两个是x和y的随机列,它取自&lt;我的笔记本电脑上的1s根据日期/时间排序:

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