我有一个使用python networkx库构建的复杂图形,我正在尝试以一种易于理解的方式来绘制它。我的数据的结构是,我总是有一个中央节点,然后是一组距离中心1的节点,然后是另一组距离中心2的节点。我所说的“距离”是指到达中心节点之前的最小边数。由于这种结构,我想以径向方式绘制图形,其中距离节点位于距中心固定半径的圆周上,假设为r=1,距离-2节点位于r=2的圆周上。如下所示:

我尝试了不同的方法,但到目前为止最有希望的方法是使用networkx.drawing.layout.shell_layout,它产生以下布局:

所有的节点都与中心节点的距离是正确的,但问题是没有选择节点在圆周上的位置来最小化边缘交叉。这一点在链接页面中有明确的说明:“此算法目前仅适用于二维,不会试图最小化边缘交叉”。我在networkx library documentation和pygraphviz 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))]发布于 2020-04-28 19:31:34
我做到了!通过使用pygraphviz的根布局(正如@sroush在给this similar question的评论中最初建议的那样),并将我想要位于中心的节点指定为“根”节点(这是我遗漏的部分!)。输出如下:

是的,它仍然有点凌乱,但我应该能够通过调整边缘的长度来改善它,不管怎样,我想这是我对混乱的数据所能做的最好的事情!
https://stackoverflow.com/questions/61466993
复制相似问题