如何在 R 的 igraph 图中为重复值设置一行?

问题描述

我有一个包含三列的数据框,想要为其绘制 igraph 图。当我通过 igraph 进行可视化时,第一列有重复的值,它有两行。但是,我只想为重复值设置一行。

这是可重现的数据:

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")

我运行了这些代码

m <- as.matrix(sample)
g <- 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

我想要从 Singkil 到 Aceh Hulu Singkil 的一条线路

解决方法

igraph::simplify() 非常适合这一点。

按如下方式修改您的 plot() 调用只会在您之前有两条线的地方绘制一条线。

plot(simplify(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")

如果您在简化之前向 igraph 对象添加权重向量,则边计数会聚合在边权重中,您可以在可视化中使用它。下面将导致相关边缘的线条稍粗。

E(g)$weight <- 1
g <- simplify(g,edge.attr.comb = "sum")
plot(g,edge.width = E(g)$weight,vertex.label.color = "black")
,

如果您的图是有向图,您可以在边列表上使用 unique(),然后将其转换为 igraph 对象以“简化”您的图。

g <- graph_from_edgelist(unique(rbind(m[,1:2],m[,2:3])),directed = TRUE)