如何增加networkx.spring_layout的节点间距

cls*_*udt 28 python graph graph-drawing networkx

绘制一个集团图

import networkx as nx
....
nx.draw(G, layout=nx.spring_layout(G))
Run Code Online (Sandbox Code Playgroud)

产生如下图:

在此输入图像描述

显然,需要增加节点之间的间隔(例如,边缘长度).我用谷歌搜索了这个,并在这里找到了这个建议:

对于某些布局算法,存在可能有帮助的"缩放"参数.例如

1中:将networkx导入为nx

2:G = nx.path_graph(4)

在[3]中:pos = nx.spring_layout(G)#default to scale = 1

在[4]中:nx.draw(G,pos)

在[5]中:pos = nx.spring_layout(G,scale = 2)#所有节点之间的双倍距离

在[6]中:nx.draw(G,pos)

但是,该scale参数似乎没有任何影响.

获得更好绘图的正确方法是什么?

Vik*_*ram 33

好吧,我对这个问题的回答太迟了.但是这个问题的解决方案在于NetworkX版本1.8尚未发布,但可以通过git hub获得.

执行以下操作以增加节点之间的距离:

    pos = nx.spring_layout(G,k=0.15,iterations=20)
    # k controls the distance between the nodes and varies between 0 and 1
    # iterations is the number of times simulated annealing is run
    # default k =0.1 and iterations=50
Run Code Online (Sandbox Code Playgroud)

调整这些参数以查看其工作原理.但尽管如此,并不能保证所有节点都不重叠


小智 5

我使用了Kamada Kawai布局的最佳距离参数,并将未连接的组件之间的距离设置为图中的最大距离。也许有更好的方法来修饰词典,但这很简单:

df = pd.DataFrame(index=G.nodes(), columns=G.nodes())
for row, data in nx.shortest_path_length(G):
    for col, dist in data.items():
        df.loc[row,col] = dist

df = df.fillna(df.max().max())

layout = nx.kamada_kawai_layout(G, dist=df.to_dict())
Run Code Online (Sandbox Code Playgroud)


Ora*_*bet 5

问题的真正答案是,原始图不是单个完全连接的组件。它是三个单独的图。

发生的事情是三个部分飞到了无穷远,这在重新缩放后使每个组件看起来像一个微小的斑点。

该算法spring_layout指定所有节点之间的排斥力(反重力),以及连接的节点之间的吸引力(“弹簧”)。

因此,如果图形未连接,则由于没有连接它们,各个零件将飞离排斥力。有两个选项:更改力定律(编辑networkx代码),或分别绘制零件图。

这是添加力以吸引所有节点到图表中心的方法。此代码段的最后一行添加到def _fruchterman_reingoldlayouts.py

# displacement "force"
displacement = np.einsum('ijk,ij->ik',
                         delta,
                         (k * k / distance**2 - A * distance / k))
# ADD THIS LINE - prevent things from flying off into infinity if not connected
displacement = displacement - pos / ( k * np.sqrt(nnodes))
Run Code Online (Sandbox Code Playgroud)

这行代码使您可以制作如下图表: 在此处输入图片说明 而不是 在此处输入图片说明 但是,处理此问题的“最佳”方法是分别绘制组件图。

您可以使用此处介绍的功能遍历组件,将它们绘制在单独的图中。

有关更多讨论,请参见此github问题