Python NetworkX - Почему графики всегда вращаются случайным образом? - PullRequest
0 голосов
/ 21 сентября 2018

Если я генерирую один и тот же график несколько раз, используя 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 намного длиннее? Обновление: я не установилАтрибут «length» в источнике данных JSON.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Алгоритм имеет случайную инициализацию - это вполне стандартно для сетевых макетов.У вас будет такая же проблема с любой библиотекой графов.Вы можете реплицировать один и тот же макет в NetworkX двумя способами: сохранить словарь положения узла (например, как json) и перезагружать его каждый раз, когда вы хотите визуализировать, или передать начальное число алгоритму макета:

seed (int, экземпляр RandomState или None необязательно (по умолчанию = None)) - установить случайное состояние для детерминированных макетов узлов.Если int, seed - это начальное число, используемое генератором случайных чисел, если экземпляр numpy.random.RandomState, seed - это генератор случайных чисел, если None, генератор случайных чисел - это экземпляр RandomState, используемый numpy.random.

надеюсь, что поможет!

0 голосов
/ 21 сентября 2018

Из документов:

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

pos: dict или None необязательно (по умолчанию = None)

Исходные позиции для узлов в виде словаря с узлом в качестве ключейи значения в виде списка или кортежа.Если Нет, используйте случайные начальные позиции.

Поэтому, если вы не укажете начальные позиции своих узлов, NetworkX сделает это случайным образом.

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

...