如果我使用NetworkX和Matplotlib多次生成相同的图,则它会在每一代随机旋转:
在不更改脚本或输入数据的情况下,图形每次生成时都会随机旋转。是否可以指定方向?
由于图形变得更加密集(上面只是示例,但最终我将有成千上万个节点和边缘),如果移动了新添加的节点或边缘,则将很难看到它们,因为图形图片已旋转。
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数据中设置“长度”属性来源。
答案 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会随机指定。
答案 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实例。
希望有帮助!