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

时间:2018-09-21 13:03:30

标签: python python-3.x graph networkx

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

运行1: Run 1

运行2: enter image description here

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

由于图形变得更加密集(上面只是示例,但最终我将有成千上万个节点和边缘),如果移动了新添加的节点或边缘,则将很难看到它们,因为图形图片已旋转。

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

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

3 个答案:

答案 0 :(得分:3)

从文档中

spring_layout(G, dim=2, k=None, pos=None, fixed=None, iterations=50, weight='weight', scale=1.0)

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

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

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

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

答案 1 :(得分:3)

我刚刚发现,您可以修复随机生成图的初始状态: 只需为生成器添加种子,即可始终生成相同的随机位置集。

random_pos = nx.random_layout(graph, seed=42)
pos = nx.spring_layout(graph, pos=random_pos)

答案 2 :(得分:2)

该算法具有随机初始化-这对于网络布局而言是相当标准的。任何图形库都将遇到相同的问题。您可以通过以下两种方式在NetworkX中复制相同的布局:保存节点位置字典(例如,作为json)并在每次要可视化时重新加载它,或将种子传递给布局算法:

  

seed(int,RandomState实例或None可选(默认值= None))–设置确定性节点布局的随机状态。如果为int,则seed为随机数生成器使用的种子;如果为numpy.random.RandomState实例,则seed为随机数生成器;如果为None,则随机数生成器为numpy.random使用的RandomState实例。

希望有帮助!