How can I rearrange the order of edges in an igraph plot?

旧巷老猫 提交于 2020-03-01 06:48:44

问题


I'm trying to make a network plot in igraph that highlights certain important edges by coloring them differently than the others. For large graphs, they often get buried under the others. For example:

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) 

gives me a plot where the single red edge is at the bottom. If I choose to color a higher-numbered edge (rather than #1) it has a better chance of not being buried.

So it seems to me that one option is to somehow re-order the edges. I tried

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

but that gets me an "invalid indexing" error. Any ideas about what else I should try?


回答1:


igraph plots the edges in the order they appear in the graph's edge list, so you are right, edges with higher IDs will be drawn on top of the edges with lower IDs. Unfortunately igraph does not provide an easy way to reorder the edges of the graph (although it has a function named permute.vertices, which will allow you to permute the vertices), so the only way I can think of right now is that you need to construct another graph in which the edges are in the "right order". make_graph ensures that the edges are stored in the graph exactly in the order you specify them, and I think so does graph_from_data_frame.

Another option (if you don't want to reconstruct the entire graph) is to plot the graph twice: first you plot the "not-so-important" edges and set the width of the important ones to zero, then you plot the important edges on top.

If you would like edge permutations to be supported in an upcoming version of igraph, please file a feature request on Github.




回答2:


You can reconstruct the graph with the edges reordered using "as_data_frame" and "graph_from_data_frame" fairly easily in conjunction with the dplyr and tidyr packages:

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

if you had a layout stored on the old graph you would need to transfer it manually...

new_graph$layout = old_graph$layout



回答3:


Or you could simply rearrange your data based on the variable you wish to be ordered and then feed it to igraph




回答4:


The reason why E(test) <- E(test)[order(E(test)$color)] can not work out is that we are not allowed to assign an 'igraph.es' variable to another existing one or itself; however, we can create a new 'igraph.es' varibale using: a <- E(test)[order(E(test)$color)]. Thus, we need create a new graph to inherit a new order of edges from the orginal graph:

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) 

As the plot shows, the red edge becomes the toppest one:



来源:https://stackoverflow.com/questions/33444188/how-can-i-rearrange-the-order-of-edges-in-an-igraph-plot

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!