更改Networkx/Matplotlib力导向图中的边长和簇间距

4

我正在尝试使用Python、NetworkX和Matplotlib输出一个力导向图的PNG。以下是当前的效果:

networkx/matplotlib force graph

节点重叠很多,边长度非常短,聚类非常稀疏。
如果使用d3.js可视化相同的图形,效果如下(忽略不同的颜色、边权重和箭头,我并不试图复制它们):

d3.js force graph

如您所见,这种排版更加易读且具有视觉吸引力,因为节点间距更大,簇更加紧密,白色空间较少。

尽管我阅读了我能找到的所有主题,并尝试了几十次节点大小、图形大小、边缘权重以及边缘长度属性(似乎没有什么作用,但可能是因为它是任意属性),但我无法使matplotlib图表看起来像d3.js一样,即使两个图表都是使用完全相同的节点、节点大小和边缘创建的。

不幸的是,在d3.js中创建它们并不是一个真正的选择,因为我希望创建成千上万个静态PNG,并且我不想在浏览器中渲染它们然后截屏!

因此,我的问题是:是否(a)有改善matplotlib布局的方法(通过增加边缘长度和/或避免节点重叠和/或减少空格),(b)输出d3.js力导向图为PNG(或任何静态格式)的方法,或者(c)我可以使用其他库来输出格式更好的力导向图像?


更新:我已经尝试过 iterations 参数,它显示了我推测的图形动画中不同点的位置,例如:pos = nx.spring_layout(G, iterations=100) nx.draw(G, pos)可能 有用,但我不确定如何确定什么数量的迭代对于不同大小的图最理想...而且,d3.js所有这些都是自动完成的。 - Chris
1
此外,我很想了解为什么有人对这篇帖子进行了负评,因为它非常清楚地概述了问题和问题的提出方式! - Chris
可能与以下内容相关:https://dev59.com/l1QJ5IYBdhLWcg3wx44V#53156709 - Paul Brodersen
1个回答

3
我找到了一种方法使它能够工作,使用graphviz_layout()而不是spring_layout()(感谢在这里找到的提示)。这需要安装一些额外的库,因此我会记录我所做的事情(在Ubuntu 16.04上),以防有人遇到类似的问题。
要使用graphviz_layout(),您首先必须导入它(from networkx.drawing.nx_agraph import graphviz_layout)。但是,您还需要安装pygraphviz,这似乎没有作为依赖项安装。
为了以一种NetworkX可以看到它的方式安装pygraphviz,我需要按照以下步骤进行操作(感谢此线程上的帖子): sudo pip install pygraphviz --install-option="--include-path=/usr/include/graphviz" --install-option="--library-path=/usr/lib/graphviz/" 使用graphviz_layout()进行可视化似乎比spring_layout()具有更少的节点重叠,并且在一般情况下具有更美观的间距。请参见下面的输出(与问题帖子中的第一张图像进行比较): working networkx/matplotlib/pygraphviz force graph 这需要大量调整才能正确完成,因此我希望对于有类似要求的其他人有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接