用空间线连接 xy 点
Connect xy points with spatial lines
我有一个 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))
我想用空间线连接所有点的所有组合,这些线以它们连接的点的组合命名
在输出结果的 "attributes table" 中,空间线的名称可能如下所示:
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.
我在这里推测您到底想要什么,但我认为您想要可视化从任何点到其他点的连接。如果是这样的话,那么这可能会奏效。
但首先,一些假设:
- 您的
x
和 y
坐标是起点。因此,id
因此是 id.origin
- 所有其他点都需要变成"destinations",然后自己的坐标变成
x_destination
等等。
<免责声明>应该更好、更优雅的方法来做到这一点。如果更有经验的人可以加入并向我展示任何 *ply
方法,我将不胜感激。 免责声明>
复制数据框以涵盖所有可能的组合
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"))
这将产生如下所示的情节:
整个解决方案如下所示:
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 和 y 从因子转换为数字
newds1$x2<-as.numeric(as.character(newds1$x2)) #converting from factor to numeric
newds1$y2<-as.numeric(as.character(newds1$y2))
绘制目标点。 . .与原点相同
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
现在是一个空向量,其中包含由 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)
我有一个 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))
我想用空间线连接所有点的所有组合,这些线以它们连接的点的组合命名
在输出结果的 "attributes table" 中,空间线的名称可能如下所示:
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.
我在这里推测您到底想要什么,但我认为您想要可视化从任何点到其他点的连接。如果是这样的话,那么这可能会奏效。 但首先,一些假设:
- 您的
x
和y
坐标是起点。因此,id
因此是id.origin
- 所有其他点都需要变成"destinations",然后自己的坐标变成
x_destination
等等。
<免责声明>应该更好、更优雅的方法来做到这一点。如果更有经验的人可以加入并向我展示任何 *ply
方法,我将不胜感激。 免责声明>
复制数据框以涵盖所有可能的组合
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"))
这将产生如下所示的情节:
整个解决方案如下所示:
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 和 y 从因子转换为数字
newds1$x2<-as.numeric(as.character(newds1$x2)) #converting from factor to numeric
newds1$y2<-as.numeric(as.character(newds1$y2))
绘制目标点。 . .与原点相同
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
现在是一个空向量,其中包含由 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)