我正在尝试使用树状数据构建图形,其中节点通常分成> 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这样的其他程序手动修复它,但是我有很多这样的构建,并且它们的大小使得手动修正变得麻烦。
非常感谢。
答案 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()
答案 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)