向networkx.spring_layout添加重力

时间:2019-04-26 18:47:26

标签: python numpy networkx

我想将“重力”的概念添加到networkx.spring_layout中。原因是我有一个我想布局的DAG,graphviz遇到了很多麻烦。使用spring_layout进行的初始实验似乎是积极的,但我想通过对所有节点施加恒定的力(当然,随着温度降低每次迭代)来确保或多或少的稳定布局。这样可以有效地沿一个方向或另一个方向“吹”所有节点,并且将根固定在一个位置。

但是,在开始之前,我想知道这是否是实现我想要的目标的一种好方法。

1 个答案:

答案 0 :(得分:1)

Graphviz有几个用于图形布局的程序,每个程序对某些类型的图形都更好。在networkx中使用的标准程序是neato。但是,对于有向图,尤其是DAG,有一种程序要好得多-dot。只需查看neato的输出即可:

nx.draw(G, pos=nx.nx_pydot.graphviz_layout(G))

enter image description here

,对于dot输出:

nx.draw(G, pos=nx.nx_pydot.graphviz_layout(G, prog='dot'))

enter image description here

我强烈建议您将graphviz_layoutprog='dot'一起使用。但是,如果要使用标准spring_layout,则应使用k参数。 Spring布局has no gravity parameter,但k是这种布局:

  

k (float (default=None)) – Optimal distance between nodes. If None the distance is set to 1/sqrt(n) where n is the number of nodes. Increase this value to move nodes farther apart.

您也可以尝试更改scale

  

scale (number (default: 1)) – Scale factor for positions. Not used unless fixed is None.

seed用于确定性图:

  

seed (int, RandomState instance or None optional (default=None)) – Set the random state for deterministic node layouts. If int, seed is the seed used by the random number generator, if numpy.random.RandomState instance, seed is the random number generator, if None, the random number generator is the RandomState instance used by numpy.random.