【问题标题】:Which layout should I use to get non-overlapping edges in igraph?我应该使用哪种布局来获得 igraph 中的非重叠边缘?
【发布时间】:2023-04-06 07:19:01
【问题描述】:

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

非常感谢。

【问题讨论】:

    标签: r plot igraph


    【解决方案1】:

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

    【讨论】:

    • 给你一些回购... :)
    【解决方案2】:

    您可能想试试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()
    

    【讨论】:

    • 警告信息:在 layout_with_fr(list(355, FALSE, c(1, 2, 3, 4, 5, 6, 7, 8, 9, : 参数‘area’被弃用并且没有效果
    • @bdemarest:您对使用什么来代替“区域”参数有什么建议吗? “区域”已弃用,我现在无法重现您的解决方案。谢谢你的想法!
    • ?layout_with_frcoolexp,maxdelta,area,repulserad 这些参数在 igraph 版本 0.8.0 中不受支持并且被忽略(带有警告)。
    • 有人找到解决方案了吗?如果没有面积 arg,我无法更改节点的密度......
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      相关资源
      最近更新 更多