Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Which layout should I use to get non-overlapping edges in igraph?

Tags:

plot

r

igraph

I am trying to build graphs using tree-like data, where nodes typically split into >2 edges. I have tried various layouts, and I see that the layout.reingold.tilford parameter will generate tree-like graphs with non-bifurcating data. However the outputs are not particularly attractive. I would rather use something like the layout.lgl or layout.kamada.kawai since these produce more radial structures. I cannot see how to change the parameters in R such that these trees have no overlapping edges though. Is this possible?

I imported a simple data file in Pajek format, with 355 nodes and 354 edges. I'm currently printing it using:

plot.igraph(g,vertex.size=3,vertex.label=NA,layout=layout.lgl)

This gives me an output like this, which is nice, but still has overlapping edges. I have read that you can manually fix this using tkplot, or another program like cytoscape, however I have quite a few of these to build, and the size of them makes manual correction a hassle.

Many thanks. Here is an example of the output I get

like image 537
Marcus Shepheard Avatar asked Dec 19 '12 21:12

Marcus Shepheard


3 Answers

Just want to add a comment but my rep is too low. The method that @bdemarest posted does not work on igraph version > 0.7. The newer version does not support the area parameter, so I cannot get the same effect. And getting the old version to build took me a while, so I though I'd share some insights. You can manually install igraph 0.7 from source if you download it from igraph nightly builds. On my machine (Mac OS 10.10), I encountered some problems building it, due to gfortran, so I found this link that solved the problem. Hope that helps anyone who wants to create similar graphs in R.

like image 164
morphe Avatar answered Nov 04 '22 08:11

morphe


You may want to try layout.fruchterman.reingold(). It seems to do a good job keeping the edges from crossing. I've tested it with a 355 node version of the barabasi graph suggested by @Tamás.

library(igraph)

g = barabasi.game(355, directed=FALSE)

png("plot1.png", height=6, width=12, units="in", res=200)
par(mfrow=c(1, 2))

plot.igraph(g,vertex.size=3,vertex.label=NA,
    layout=layout.fruchterman.reingold(g, niter=10000))
mtext("layout.fruchterman.reingold, area = vcount^2", side=1)

plot.igraph(g,vertex.size=3,vertex.label=NA,
    layout=layout.fruchterman.reingold(g, niter=10000, area=30*vcount(g)^2))
mtext("layout.fruchterman.reingold, area = 30 * vcount^2", side=1)

dev.off()

enter image description here

like image 27
bdemarest Avatar answered Nov 04 '22 09:11

bdemarest


layout.reingold.tilford has a parameter called circular. Setting this to TRUE will convert the final layout into a radial one by treating the X coordinate as the angle (after appropriate rescaling) and the Y coordinate as the radius. Ironically enough, this does not guarantee that there will be no edge crossings in the end, but it works nicely if your subtrees are not exceedingly wide compared to the rest of the graph:

> g <- barabasi.game(100, directed=F)
> layout <- layout.reingold.tilford(g, circular=T)
> plot(g, layout=layout)
like image 13
Tamás Avatar answered Nov 04 '22 08:11

Tamás