用空间线连接xy点

时间:2015-03-26 19:28:22

标签: r latitude-longitude spatial lines points

我有一个XY点数据集,看起来像这样

x<-c(2,4,6,3,7,9,1)
y<-c(6,4,8,2,9,6,1)
id<-c("a","b","c","d","e","f","g")
dataset<-data.frame(cbind(x,y,id))

我想将所有点的所有组合与空间线连接起来,用他们所连接的点组合命名的行

在&#34;属性表&#34;由输出产生的结果,空间线的名称可能如下所示:

a_b
a_c
a_d
a_e
a_f
a_g
b_a
b_c
b_d
b_e
b_f
b_g
c_a
etc.

2 个答案:

答案 0 :(得分:3)

我在这里猜测你究竟想要什么,但我认为你想要想象从任何一点到其他点的连接。如果是这种情况,那么这可能会奏效。 但首先是一些假设:

  • 您的xy坐标是起点。因此,id因此id.origin
  • 所有其他点都需要成为“目的地”,然后他们自己的坐标将变为x_destination,依此类推。

&LT;声明&GT; 应该更好,更优雅的方式来做到这一点。如果有经验的人可以参加并向我展示任何*ply方法,我会很感激。 &LT; /声明&GT;

复制数据框以涵盖所有可能的组合

dataset<-do.call(rbind, replicate(7, dataset, simplify=FALSE))

现在,创建一个包含所有相同目标点的矩阵,混合:

nm=matrix(ncol=3)
for (i in 1:7){
    nm<-rbind(nm,do.call(rbind,replicate(7,as.matrix(dataset[i,]),simplify=FALSE)))
}
nm<-nm[-1,]

重命名矩阵的列,使它们有意义,并将现有数据框与新矩阵

绑定
colnames(nm)<-c("x2","y2","id.dest")
newds<-cbind(dataset,as.data.frame(nm))

删除重复的轨迹:

newds<-newds[-which(newds$id.origin==newds$id.dest),]

并使用geom_segment绘制结果:

p<-ggplot(newds,aes(x=x,y=y))+geom_segment(aes(xend=x2,yend=y2))

有一种方法可以命名这些片段,但是从观察情节我不建议这样做。相反,您可以考虑使用geom_text命名这些点(其他选项可用,请参阅?annotate)。

p<-p + geom_text(aes(x=1.8,y=6.1,label="a"))

这将产生一个像这里的情节: Quiver-like plot of distances

答案 1 :(得分:2)

整个解决方案如下:

plot(dataset$x,dataset$y)

复制数据框以涵盖所有可能的组合

dataset<-do.call(rbind, replicate(7, dataset, simplify=FALSE))

现在,创建一个包含所有相同目标点的矩阵,混合:

nm=matrix(ncol=3)
for (i in 1:7){
  nm<-rbind(nm,do.call(rbind,replicate(7,as.matrix(dataset[i,]),simplify=FALSE)))
}
nm<-nm[-1,]

重命名矩阵的列,使它们有意义,并将现有数据框与新矩阵

绑定
colnames(nm)<-c("x2","y2","id.dest")
newds<-cbind(dataset,as.data.frame(nm))

删除重复的轨迹:

newds1<-newds[-which(newds$id==newds$id.dest),]

library(ggplot2)

转换目的地x&amp; y来自因子

的数字
newds1$x2<-as.numeric(as.character(newds1$x2)) #converting from factor to numeric
newds1$y2<-as.numeric(as.character(newds1$y2))

绘制目的地点。 。 .same作为原点

plot(newds1$x, newds1$y) 
plot(newds1$x2, newds1$y2, col="red") 

现在使用此答案中的代码:

<强> Convert Begin and End Coordinates into Spatial Lines in R

存储Lines对象的原始列表:

l <- vector("list", nrow(newds1)) #

l现在是一个空向量w /行数由newds1的长度(nrow)定义

拆分原点和目的地坐标,以便我可以运行此脚本:

origins<-data.frame(cbind(newds1$x, newds1$y))
destinations<-data.frame(cbind(newds1$x2, newds1$y2))

library(sp)
for (i in seq_along(l)) {
  l[[i]] <- Lines(list(Line(rbind(origins[i, ], destinations[i,]))), as.character(i))
}

l.spatial<-SpatialLines(l)
plot(l.spatial, add=T)