我正在尝试使用树状数据构建图形,其中节点通常分成> 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中创建类似图形的人.
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)

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)