如何重新排列igraph图中边缘的顺序?

时间:2015-10-30 20:13:09

标签: r igraph

我试图在igraph中创建一个网络图,通过对它们进行不同着色来突出显示某些重要边缘。对于大型图表,它们经常被埋在其他图形之下。例如:

library(igraph)
test <- barabasi.game(200,m=2)
E(test)$color <- "gray"
E(test)[1]$color <- "red"
sort(order(E(test)$color)[E(test)],decreasing=TRUE)
plot(test,
     vertex.label=NA,
     vertex.shape="none",
     vertex.size=0,
     edge.arrow.mode=0,
     edge.width=2) 

给我一​​个图,其中单个红色边缘位于底部。 this plot makes me sad 如果我选择为较高编号的边缘(而不是#1)着色,则更有可能不被埋没。

所以在我看来,一个选项是以某种方式重新排序边缘。我试过了

E(test) <- E(test)[order(E(test)$color)]

但这让我得到了一个无效的索引&#34;错误。关于我还应该尝试什么的任何想法?

4 个答案:

答案 0 :(得分:3)

igraph以图形边缘列表中出现的顺序绘制边缘,因此您是正确的,具有较高ID的边缘将在具有较低ID的边缘上绘制。不幸的是,igraph没有提供一种简单的方法来重新排序图形的边缘(虽然它有一个名为permute.vertices的函数,它允许你置换顶点),所以我现在能想到的唯一方法是你需要构建另一个图形,其中边缘在&#34;右边的顺序&#34;。 make_graph确保边缘完全按照您指定的顺序存储在图表中,我认为graph_from_data_frame也是如此。

另一种选择(如果你不想重建整个图形)是绘制图形两次:首先你绘制&#34;不那么重要的&#34;边缘并将重要的宽度设置为零,然后将重要边缘绘制在顶部。

如果您希望在即将推出的igraph版本中支持边缘排列,请在Github上file a feature request

答案 1 :(得分:3)

您可以使用“as_data_frame”和“graph_from_data_frame”重新排序边缘,并与dplyr和tidyr包一起轻松地重新构建图形:

new_graph=graph_from_data_frame(d=as_data_frame(old_graph,what="edges") %>%
    arrange(desc(ordering_attribute)),
    vertices=as_data_frame(old_graph,what="vertices"))

如果您在旧图表上存储了布局,则需要手动传输...

new_graph$layout = old_graph$layout

答案 2 :(得分:0)

或者您可以根据您想要订购的变量重新排列数据,然后将其提供给igraph

答案 3 :(得分:0)

E(test) <- E(test)[order(E(test)$color)]无法解决的原因是我们不允许将'igraph.es'变量分配给另一个现有变量或其自身;但是,我们可以使用a <- E(test)[order(E(test)$color)]创建一个新的'igraph.es'变量。因此,我们需要创建一个新图形来从原始图继承新的边缘顺序:

library(igraph)
test <- barabasi.game(200,m=2)
E(test)$color <- "gray"
E(test)[1]$color <- "red"

# to make a new graph:test2 whose edges are descended from the ordering edges of the orginal graph:test
test2 <- make_graph(as.vector(t(get.edgelist(test)[order(E(test)$color),])))
# to assign the attribute value to the edges of the new graph
E(test2)$color <- E(test)$color[order(E(test)$color)]

plot(test2,
 vertex.label=NA,
 vertex.shape="none",
 vertex.size=0,
 edge.arrow.mode=0,
 edge.width=2) 

如图所示,红色边缘成为最顶端的边缘: plot of the new graph:test2