【问题标题】:Minimize crossings in a radial graph (networkx, graphviz)最小化径向图中的交叉点(networkx,graphviz)
【发布时间】:2020-04-27 19:34:45
【问题描述】:

我有一个使用 python networkx 库构建的复杂图形,我试图以一种易于理解的方式绘制它。我的数据的结构方式是,我总是有一个中心节点,然后是一组距离中心 1 的节点,然后是另一组距离中心 2 的节点。 “距离”是指到达中心节点之前的最小边数。由于这种结构,我想以径向方式绘制图形,其中距离为 1 的节点位于距中心固定半径的圆周上,例如r=1,距离为 2 的节点位于圆周上的r=2。 像这样的东西: 我尝试了不同的方法,但迄今为止最有希望的方法是使用networkx.drawing.layout.shell_layout,它会产生以下布局: 所有节点与中心节点的距离都合适,但问题是没有选择节点在圆周上的位置以最小化边缘交叉。这在链接页面“该算法目前仅适用于二维并且不尝试最小化边缘交叉”中明确说明。我查看了networkx library documentationpygraphviz one,但我还没有找到允许最小化交叉点和同时将节点定位在同心圆周上的布局。有人知道怎么做吗?

编辑:这是图 2 中显示的图的边缘(这是一个有向图!)。

edges = [((3, 446), (3, 439)), ((3, 446), (3, 502)), ((3, 446), (3, 2366)), ((3, 446), (3, 382)), ((3, 446), (3, 3556)), ((3, 446), (4, 1778)), ((3, 446), (3, 1214)), ((3, 446), (3, 445)), ((3, 446), (4, 758)), ((3, 439), (2, 253)), ((3, 439), (3, 446)), ((3, 439), (3, 3482)), ((3, 439), (4, 1763)), ((3, 439), (3, 2359)), ((3, 439), (3, 319)), ((2, 253), (3, 439)), ((2, 127), (3, 502)), ((3, 502), (2, 127)), ((3, 502), (3, 446)), ((3, 502), (3, 4004)), ((3, 502), (3, 508)), ((3, 502), (4, 998)), ((3, 502), (3, 3986)), ((3, 502), (4, 2018)), ((3, 502), (3, 1270)), ((3, 4004), (3, 502)), ((3, 4004), (3, 3556)), ((4, 1270), (4, 758)), ((4, 758), (3, 446)), ((4, 758), (4, 998)), ((4, 758), (4, 502)), ((4, 758), (4, 638)), ((4, 758), (4, 743)), ((4, 758), (4, 1270)), ((3, 508), (3, 502)), ((4, 2300), (3, 382)), ((3, 382), (4, 2300)), ((3, 382), (3, 254)), ((3, 382), (3, 446)), ((3, 1270), (3, 1214)), ((3, 1270), (3, 502)), ((3, 1214), (3, 1270)), ((3, 1214), (3, 446)), ((3, 1214), (3, 1207)), ((3, 1214), (3, 254)), ((3, 3482), (3, 439)), ((3, 3482), (3, 3538)), ((2, 254), (3, 3556)), ((3, 3556), (3, 4004)), ((3, 3556), (2, 254)), ((3, 3556), (4, 1660)), ((3, 3556), (3, 446)), ((4, 1763), (3, 439)), ((4, 1763), (4, 1778)), ((2, 191), (3, 2366)), ((3, 2366), (4, 3190)), ((3, 2366), (3, 2359)), ((3, 2366), (3, 446)), ((3, 2366), (2, 191)), ((4, 3190), (3, 2366)), ((4, 998), (4, 758)), ((4, 998), (3, 502)), ((3, 3986), (3, 502)), ((3, 3986), (3, 3538)), ((3, 2359), (3, 2366)), ((3, 2359), (3, 439)), ((4, 1660), (3, 3556)), ((4, 3698), (4, 1778)), ((4, 1778), (4, 2018)), ((4, 1778), (4, 1780)), ((4, 1778), (4, 1763)), ((4, 1778), (3, 446)), ((4, 1778), (4, 3698)), ((4, 2018), (4, 1778)), ((3, 254), (3, 382)), ((3, 254), (3, 1214)), ((4, 1780), (4, 1778)), ((4, 502), (3, 382)), ((4, 502), (4, 758)), ((4, 638), (4, 758)), ((3, 319), (3, 439)), ((4, 743), (4, 758)), ((4, 743), (3, 439)), ((3, 1207), (3, 439)), ((4, 3320), (3, 445)), ((3, 445), (3, 446)), ((3, 445), (4, 3320)), ((3, 445), (3, 443)), ((3, 443), (3, 3538)), ((3, 3538), (3, 3986)), ((3, 3538), (3, 3482)), ((3, 3538), (3, 446)), ((3, 3538), (3, 443)), ((4, 1777), (4, 1778))]

【问题讨论】:

  • 你会分享你的输入数据吗
  • 请你分享一个你用来生成第二张图的边的样本吗?
  • @yatu 我在问题中添加了边缘数据。
  • @sroush 我将边缘数据添加到问题中。

标签: python graph networkx graphviz


【解决方案1】:

我做到了!通过使用 pygraphviz 的twopi 布局(最初由@sroush 在对this similar question 的评论中建议)并将我想要位于中心的节点指定为“根”节点(这是我缺少的部分! )。输出如下: 是的,它仍然有点乱,但我应该能够通过调整边缘的长度来改进它,无论如何,我想这是我能用我的凌乱数据做的最好的事情!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    相关资源
    最近更新 更多