Python NetworkX - 为什么图形总是随机旋转?

jwb*_*ley 5 python graph networkx python-3.x

如果我使用 NetworkX 和 Matplotlib 多次生成相同的图形,它会在每一代中随机旋转:

运行 1: 运行 1

运行 2: 在此处输入图片说明

在不改变脚本或输入数据的情况下,图形在每次生成时随机旋转。是否可以指定方向?

随着图形变得更加密集(以上只是样本,但最终我将有数千个节点和边),如果由于图形图片旋转而移动新添加的节点或边,将很难看到它们。

import networkx as nx
import matplotlib.pyplot as plt
from networkx.readwrite import json_graph
#
# The graph data is loaded from JSON
#
graph = json_graph.node_link_graph(input_json)
    pos = nx.spring_layout(graph)
    nx.draw(graph, pos, with_labels=True, node_size=300)
    edge_labels=dict([((u,v,),d['weight']) for u,v,d in graph.edges(data=True)])
    nx.draw_networkx_edge_labels(graph, pos, edge_labels=edge_labels)
    plt.savefig("test.png")
Run Code Online (Sandbox Code Playgroud)

第二个不太重要的问题是为什么从 R1 到 R2 和 R1 到 R5 的边/线要长得多?更新:我没有在 JSON 数据源中设置“长度”属性。

fab*_*ioM 7

我刚刚发现您可以修复随机生成图的初始状态:只需为生成器设置种子,它就会始终生成相同的一组随机位置。

random_pos = nx.random_layout(graph, seed=42)
pos = nx.spring_layout(graph, pos=random_pos)
Run Code Online (Sandbox Code Playgroud)


And*_*ndy 5

从文档:

spring_layout(G, dim=2, k=None, pos=None, fixed=None, iterations=50, weight='weight', scale=1.0)
Run Code Online (Sandbox Code Playgroud)

pos : dict 或 None 可选(默认=无)

节点的初始位置作为字典,节点作为键,值作为列表或元组。如果没有,则使用随机初始位置。

因此,如果您不指定节点的初始位置,NetworkX 将随机指定。

https://networkx.github.io/documentation/networkx-1.9/reference/generated/networkx.drawing.layout.spring_layout.html

  • 您可以重复使用 pos 变量。spring_layout() 返回位置并且您已经将它们存储在 pos 变量中。因此,第一次让 NetworkX 随机定位节点,然后将位置保存到文件并在下次显示图形时重新使用位置。 (2认同)