我试图在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)
给我一个图,其中单个红色边缘位于底部。 如果我选择为较高编号的边缘(而不是#1)着色,则更有可能不被埋没。
所以在我看来,一个选项是以某种方式重新排序边缘。我试过了
E(test) <- E(test)[order(E(test)$color)]
但这让我得到了一个无效的索引&#34;错误。关于我还应该尝试什么的任何想法?
答案 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)