问题描述
我有一个包含三列的数据框,想要为其绘制 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")
我想要从 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)