问题描述
有一个 igraph
情节。我想手动排序线的位置。
例如,在上图中,Tamiang 线必须出现在顶部的第二行,而 Sigulai -> ERROR -> NA 线出现在情节的底部。 这是数据:
dput(sample)
structure(list(NMSUKU = c("Aceh/ Achin/ Akhir/ Asji/ A-Tse/ Ureung Aceh","Alas","Aneuk Jamee","Gayo","Gayo Lut","Gayo Luwes","Gayo Serbe Jadi","Kluet","Sigulai","Simeulue","Singkil","Tamiang"),TopLang = c("Aceh/ Acheh/ Achi ","Alas ","Aceh Jamee ","Gajo/ Gayo ","Aceh Kluet ","ERROR TopCol out of range ","Long Bano/ Simalur/ Simeuloe/ Simeulue/ Simulul ","Aceh Simeleu Barat ","Aceh Simeleu Tengah ","Aceh Hulu Singkil ","Tamiang "),Ethnicity = c("1_Aceh/ Achin/ Akhir/ Asji/ A-Tse/ Ureung Aceh ","2_Alas ","3_Aneuk Jamee ","4_Gayo ","6_Gayo Luwes ","5_Gayo Lut ","7_Gayo Serbe Jadi ","8_Kluet ","NA ","10_Simeulue ","11_Singkil ","17_Batak Pakpak Dairi ","12_Tamiang ")),row.names = c(NA,-15L),class = "data.frame")
这是代码:
Library(igraph)
m <- as.matrix(replace(sample,sample == "","NA"))
g <- simplify(graph_from_edgelist(rbind(m[,1:2],m[,2:3]),directed = TRUE))
l <- layout_with_sugiyama(g)
plot(g,layout = -l$layout[,2:1],edge.arrow.size = 0.1,vertex.size = 2.5,vertex.color = "grey",vertex.label.dist = 1,edge.arrow.width = 1.5,edge.width = seq(0.5,0.08),edge.lty = "solid",edge.color = "gray",vertex.label.cex = 0.7,is.rm = TRUE,vertex.label.color = "black"
)
想要我想变成这样: 我认为这是手动创建的。反正最后的图应该和这个一样,也可以对item的位置进行排序。
谢谢!
解决方法
在您的布局生成器中,有一个参数 layers
接受子网络列表。如果您按照您想要的顺序手动创建此列表,Sugiyama 将按照此顺序并按指定绘制网络。
layers = list(c("Tamiang","Tamiang","12_Tamiang"),c("Alas","Alas","2_Alas"),....))
然后你用这个图层列表调用布局:
l <- layout_with_sugiyama(g,layers=apply(sapply(layers,function(x) V(g)$name %in% x),1,which))
只有一个小问题:您的节点标识符不是唯一的。您必须使它们独一无二才能使 sapply()
函数在此示例中正常工作。
另请查看手册以获取有关此布局的其他信息: https://igraph.org/r/doc/layout_with_sugiyama.html