如何在 R 中的 igraph 图中有一行重复值?
How to have one line for duplicates value in igraph plot in R?
我有一个包含三列的数据框,想要为其绘制 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", "Simeulue", "Simeulue", "Singkil",
"Singkil", "Tamiang"), TopLang = c("Aceh/ Acheh/ Achi ", "Alas ",
"Aceh Jamee ", "Gajo/ Gayo ", "Gajo/ Gayo ", "Gajo/ Gayo ", "Gajo/ Gayo ",
"Aceh Kluet ", "ERROR TopCol out of range ", "Long Bano/ Simalur/ Simeuloe/ Simeulue/ Simulul ",
"Aceh Simeleu Barat ", "Aceh Simeleu Tengah ", "Aceh Hulu Singkil ",
"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 ",
"10_Simeulue ", "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, 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 = E(g)$weight,
edge.lty = "solid",
edge.color = "gray",
vertex.label.cex = 0.7,
is.rm = TRUE,
vertex.label.color = "black")
如果您的图表是有向的,您可以在边缘列表上使用 unique()
,然后再将其变成 igraph
对象以“简化”您的图表。
g <- graph_from_edgelist(unique(rbind(m[, 1:2], m[, 2:3])), directed = TRUE)
我有一个包含三列的数据框,想要为其绘制 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", "Simeulue", "Simeulue", "Singkil",
"Singkil", "Tamiang"), TopLang = c("Aceh/ Acheh/ Achi ", "Alas ",
"Aceh Jamee ", "Gajo/ Gayo ", "Gajo/ Gayo ", "Gajo/ Gayo ", "Gajo/ Gayo ",
"Aceh Kluet ", "ERROR TopCol out of range ", "Long Bano/ Simalur/ Simeuloe/ Simeulue/ Simulul ",
"Aceh Simeleu Barat ", "Aceh Simeleu Tengah ", "Aceh Hulu Singkil ",
"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 ",
"10_Simeulue ", "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, 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 = E(g)$weight,
edge.lty = "solid",
edge.color = "gray",
vertex.label.cex = 0.7,
is.rm = TRUE,
vertex.label.color = "black")
如果您的图表是有向的,您可以在边缘列表上使用 unique()
,然后再将其变成 igraph
对象以“简化”您的图表。
g <- graph_from_edgelist(unique(rbind(m[, 1:2], m[, 2:3])), directed = TRUE)