Учитывая этот контекст, у меня есть две связанные проблемы с графиком, который я рисую после каждого раунда цикла. Одним из них является положение узлов. Мне нужно, чтобы узлы изначально оставались в одном и том же положении после каждой итерации. Я использовал nx.spring_layout(G), но после каждой итерации узлы меняют положение, и это затрудняет отслеживание процесса перемонтажа и оценку эволюции сети. По этой причине я решил использовать круговой макет nx.set_node_attributes(G, nx.circular_layout(G), 'pos'), но это не тот формат, который мне хотелось бы иметь в сети. Я бы хотел, чтобы это была случайная сеть.
Вторая проблема связана с процессом перемонтирования. После каждой итерации мне нужно было, чтобы ребра, вес которых увеличился, сжимались или иным образом позволяли узлам компонентов приближаться друг к другу. И наоборот для ребер, которые стали слабее (их узлы должны отделиться друг от друга).
Короче, мне нужно, чтобы узлы сети оставались на прежнем месте, пока не начнется процесс перемонтажа изменяет веса их ребер, что должно заставлять узлы сближаться или разделяться дальше.
До сих пор я пытался нарисовать график следующим образом:
Код: Выделить всё
def draw_graph_to_file(G: nx.Graph, iteration: int):
cleaned_labels = {node: node.split('_')[1] for node in G.nodes()}
node_colors = ['pink' if 'S++' in node else 'lightblue' for node in G.nodes()]
edge_weights = nx.get_edge_attributes(G, 'weight')
edge_widths = [0.1 * G[node1][node2]['weight'] for node1, node2 in G.edges()]
edge_colors = ['red' if weight < 10 else 'green' if weight > 10 else 'blue' for weight in edge_weights.values()]
nodePos = nx.get_node_attributes(G, 'pos')
nx.draw(G, pos=nodePos, with_labels=True, node_color=node_colors,labels=cleaned_labels, edge_color=edge_colors, width=edge_widths)
plt.title(f"Random Network - {iteration}")
# the next lines stores the images in a directory
create_folder_if_not_exists(f"generatedImages/Network{networkNum}")
plt.savefig(f"generatedImages/Network{networkNum}/Random Network - {iteration}.png")
plt.clf()
return
Я пробовал использовать макет Force Atlas, но решение было хуже: я возвращался к разбросанным узлам по всему кадру без ощущения сжатия или расширения (и я не хочу делать этот вопрос слишком длинным, поэтому я выиграл не вставляю сюда).
Буду очень признателен за любую помощь. Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/783 ... nge-in-edg