29

我正在尝试使用树状数据构建图形,其中节点通常分成> 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)手动修复此问题,但是我有很多这些要构建,而且它们的大小使手动更正变得很麻烦。

非常感谢。 这是我得到的输出示例

4

3 回答 3

20

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

于 2015-07-22T11:31:41.087 回答
19

你可能想试试layout.fruchterman.reingold()。防止边缘交叉似乎做得很好。我已经用@Tamás 建议的 355 节点版本的 barabasi 图对其进行了测试。

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()

在此处输入图像描述

于 2012-12-21T06:49:58.580 回答
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)
于 2012-12-20T18:55:17.883 回答