【问题标题】:How to increase node spacing for networkx.spring_layout如何增加 networkx.spring_layout 的节点间距
【发布时间】:2013-01-11 17:19:50
【问题描述】:

画一个团图
import networkx as nx
....
nx.draw(G, layout=nx.spring_layout(G))

生成以下图片:

显然,节点之间的间距(例如,边长)需要增加。我用谷歌搜索了这个并在这里找到了this suggestion

对于某些布局算法,有一个 scale 参数 可能有帮助。例如

import networkx as nx
G = nx.path_graph(4)
pos = nx.spring_layout(G)  # default to scale=1
nx.draw(G, pos)
pos = nx.spring_layout(G, scale=2)  # double distance between all nodes
nx.draw(G, pos)

但是,scale 参数似乎没有任何作用。

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

【问题讨论】:

  • 除了下面提供的答案,我还发现增加图形大小会有所帮助。

标签: python graph networkx graph-drawing


【解决方案1】:

这个问题的解决方案在于 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

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

【讨论】:

【解决方案2】:

真正回答你的问题是你的原始图表不是一个单一的,fully-connected component。它是三个独立的图表。

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

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

因此,如果图形未连接,则各个部分将飞离排斥力,因为没有任何东西连接它们。有两种选择:更改力定律(编辑 networkx 代码),或单独绘制组件。

以下是如何添加将所有节点吸引到图表中心的力。在layouts.pydef _fruchterman_reingold中添加这段代码的最后一行sn -p:

# 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))

这行代码允许您制作如下图表: 而不是 然而,处理这个问题的“最佳”方法是单独绘制组件图表。

您可以使用here 描述的函数对组件进行迭代,将它们绘制在单独的图中。

更多讨论请见this github issue

【讨论】:

    【解决方案3】:

    我使用了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())
    

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      相关资源
      最近更新 更多