如何在igraph中将节点列表转换为边列表(凸包绘图场景)
在igraph中将凸包节点列表转换为边列表并绘制图形
你手头有个空图,需要基于带内部顶点的凸包完成绘制,目前尝试的代码如下:
library(igraph) set.seed(45) n = 10 g <- graph.empty(n) xy <- cbind(runif(n), runif(n)) vp <- convex_hull(xy)$resverts + 1 #[1] 8 10 7 2 1 ## convert node_list to edge_list plot(g, layout=xy)
解决方法
要把凸包的节点列表vp转成能添加到igraph的边列表,关键是让凸包节点首尾相连形成闭合多边形:
- 先生成闭合的边对:把
vp里的每个节点和下一个节点配对,最后一个节点再和第一个节点接上,形成闭环 - 用
add_edges()把这些边添加到空图里
修改后的完整代码:
library(igraph) set.seed(45) n = 10 g <- graph.empty(n) xy <- cbind(runif(n), runif(n)) vp <- convex_hull(xy)$resverts + 1 #[1] 8 10 7 2 1 # 把节点列表转成闭合边序列 edges <- c(rbind(vp, c(tail(vp, -1), vp[1]))) # 给空图添加边 g <- add_edges(g, edges) # 绘图,可自定义样式突出凸包 plot(g, layout=xy, edge.color="red", vertex.size=10)
简单解释下:
rbind(vp, c(tail(vp, -1), vp[1]))生成了两两对应的节点对:比如vp是[8,10,7,2,1],第二行就是[10,7,2,1,8],合并后就是8-10,10-7,7-2,2-1,1-8的扁平化边序列add_edges()需要扁平化的边向量,所以用c()把矩阵转成一维向量传入- 绘图时可以调整边色、节点大小,让凸包的轮廓更明显
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

