如何在R中的igraph图中对重复值进行排序?

问题描述

一个 igraph 情节。我想手动排序线的位置。

enter image description here

例如,在上图中,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"
)

想要我想变成这样:

enter image description here

我认为这是手动创建的。反正最后的图应该和这个一样,也可以对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