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

Mar*_*ard 28 plot r 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)
Run Code Online (Sandbox Code Playgroud)

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

非常感谢. 这是我得到的输出的一个例子

小智 19

只是想添加评论,但我的代表太低了.@bdemarest发布的方法在igraph版本> 0.7时不起作用.较新的版本不支持该area参数,因此我无法获得相同的效果.让旧版本构建需要一段时间,所以我会分享一些见解.igraph如果从igraph每晚构建下载它,您可以从源手动安装0.7 .在我的机器上(Mac OS 10.10),我遇到了一些问题,因为gfortran我找到了解决这个问题的链接.希望能帮助任何想要在R中创建类似图形的人.

  • 给你一些回购...... :) (3认同)

bde*_*est 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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 警告消息:在layout_with_fr中(列表(355,FALSE,c(1,2,3,4,5,6,7,8,9,:参数`area'已弃用且无效 (5认同)
  • `?layout_with_fr`coolexp,maxdelta,area,repulserad 这些参数从 igraph 0.8.0 版开始不受支持并且被忽略(带有警告)。 (2认同)

Tam*_*más 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)
Run Code Online (Sandbox Code Playgroud)