Как сделать узлы в NetworkX динамическими, сближаться или разделяться из-за изменения веса реберPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как сделать узлы в NetworkX динамическими, сближаться или разделяться из-за изменения веса ребер

Сообщение Anonymous »

У меня есть сеть, ребра которой могут циклически меняться в процессе перемонтирования. В каждом раунде некоторые ребра могут увеличивать свой вес, усиливая связь между парой узлов-компонентов, некоторые из них могут уменьшать свой вес, ослабляя связь между ними, или некоторые ребра могут удаляться в зависимости от различных факторов.
Учитывая этот контекст, у меня есть две связанные проблемы с графиком, который я рисую после каждого раунда цикла. Одним из них является положение узлов. Мне нужно, чтобы узлы изначально оставались в одном и том же положении после каждой итерации. Я использовал 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»