我想将“重力”的概念添加到networkx.spring_layout
中。原因是我有一个我想布局的DAG,graphviz遇到了很多麻烦。使用spring_layout
进行的初始实验似乎是积极的,但我想通过对所有节点施加恒定的力(当然,随着温度降低每次迭代)来确保或多或少的稳定布局。这样可以有效地沿一个方向或另一个方向“吹”所有节点,并且将根固定在一个位置。
但是,在开始之前,我想知道这是否是实现我想要的目标的一种好方法。
答案 0 :(得分:1)
Graphviz有几个用于图形布局的程序,每个程序对某些类型的图形都更好。在networkx中使用的标准程序是neato
。但是,对于有向图,尤其是DAG,有一种程序要好得多-dot
。只需查看neato
的输出即可:
nx.draw(G, pos=nx.nx_pydot.graphviz_layout(G))
,对于dot
输出:
nx.draw(G, pos=nx.nx_pydot.graphviz_layout(G, prog='dot'))
我强烈建议您将graphviz_layout
与prog='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.