我应该使用哪种布局来获得igraph中不重叠的边?

时间:2012-12-19 21:55:34

标签: r plot igraph

我正在尝试使用树状数据构建图形,其中节点通常分成> 2个边缘。我尝试了各种布局,我看到layout.reingold.tilford参数将生成具有非分叉数据的树状图。然而,产出并不是特别有吸引力。我宁愿使用类似layout.lgl或layout.kamada.kawai的东西,因为它们会产生更多的径向结构。我无法看到如何更改R中的参数,使这些树没有重叠的边缘。这可能吗?

我导入了一个Pajek格式的简单数据文件,包含355个节点和354个边。我目前正在使用:

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

这给了我这样的输出,这很好,但仍然有重叠的边缘。我已经读过你可以使用tkplot或者像cytoscape这样的其他程序手动修复它,但是我有很多这样的构建,并且它们的大小使得手动修正变得麻烦。

非常感谢。 Here is an example of the output I get

3 个答案:

答案 0 :(得分:19)

只想添加评论,但我的代表太低了。 @bdemarest发布的方法不适用于igraph版本> 0.7。较新的版本不支持area参数,因此我无法获得相同的效果。建立旧版本花了我一段时间,所以我虽然分享了一些见解。如果您从igraph nightly builds下载,则可以从源手动安装igraph 0.7。在我的机器上(Mac OS 10.10),由于gfortran,我在构建它时遇到了一些问题,所以我发现this link解决了这个问题。希望能帮助任何想在R中创建类似图表的人。

答案 1 :(得分:18)

您可以尝试layout.fruchterman.reingold()。它似乎可以很好地防止边缘交叉。我用@Tamás建议的barabasi图的355节点版本测试了它。

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

答案 2 :(得分:13)

layout.reingold.tilford有一个名为circular的参数。将此设置为TRUE会将最终布局转换为径向布局,方法是将X坐标视为角度(经过适当的重新缩放后),将Y坐标视为半径。具有讽刺意味的是,这并不能保证最终不存在边缘交叉,但如果你的子树与图表的其余部分相比不是很宽,那么它可以很好地工作:

> g <- barabasi.game(100, directed=F)
> layout <- layout.reingold.tilford(g, circular=T)
> plot(g, layout=layout)