Как добавить несколько ребер из нескольких узлов, которые уже созданы с networkx? - PullRequest
2 голосов
/ 05 апреля 2019

Когда я создаю словарь узлов с их кортежами координат, как я могу добавить ребра от узла к узлу и поддерживать стабильность графика без каких-либо движений?

Я искал другие решения вокругдокументация по networkx и Google тоже.Я обнаружил, что использую функцию add_edges_from(), которая создает путь от узла к узлу.Однако, при этом, это не будет в правильных координатах и ​​будет в основном перемещаться.Я сделал сообщение в StackOverflow ( здесь ), чтобы использовать координаты узла и нарисовать график.Это то, что я хотел, но теперь мой компромисс в том, что я теряю свои преимущества.В моем ex.txt я анализирую свои узлы и их координаты.После анализа моих узлов и координат, я смотрю, какой узел имеет ребро к другому узлу.

ex.txt файл:

3
a2a 5 0
##start
a0 1 2
##end
a1 9 2
3 5 4
a0-a2a
a0-3
a2a-1
3-1
a2a-3

файл python:

import re
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
%matplotlib inline
def file_parsing(file_path):
    cnt = 0
    output_list = []

    with open(file_path, 'r') as fp:
        for line in fp:
            cnt += 1
            #checks for the room name and coordinates
            if re.match('([^\s#]{1,10}) (\d+) (\d+)', line, re.MULTILINE):
                output_list.append(line.strip().split(' '))
            #checks for start
            if line.startswith('##start'):
                output_list.append(next(fp, '').strip().split())
            #checks for start
            if line.startswith('##end'):
                output_list.append(next(fp, '').strip().split())
    room_name = [item[0] for item in output_list]
    x_coord = [int(item[1]) for item in output_list]
    y_coord = [int(item[2]) for item in output_list]
    x_y = list(zip(x_coord, y_coord))
    pos_dict = dict(zip(room_name, x_y))
    return pos_dict

room_pos_dict = file_parsing('ex.txt')
print(room_pos_dict)
G = nx.Graph()
G.add_nodes_from(room_pos_dict.keys())
nx.set_node_attributes(G, room_pos_dict, 'pos')
# nx.set_edge_attributes(G, room_pos_dict.values(), 'pos')
nx.draw_networkx(G, pos=nx.get_node_attributes(G, 'pos'))

Это был бы идеальный график, который я разобрал: edges digraph

Но теперь они размещены случайным образом повсюду.

Теперь, из моего предыдущего поста, который я сделал (спасибо, Мухаммед Кашиф), Я получаю положение всех моих узлов, но не ребер:

positioned nodes

Моя ожидаемая комбинация обоих: узлов с их положением и ребер, соединенных с каждым узлом.

Пожалуйста, потерпите меня, я пытаюсь изучить Python и networkx :).Заранее спасибо!

1 Ответ

1 голос
/ 05 апреля 2019

Обновленный ответ
Предполагая, что содержимое ex.txt:

3
a2a 5 0
##start
a0 1 2
##end
a1 9 2
3 5 4
a0-a2a
a0-3
a2a-a1
3-a1
a2a-3

Итак, после нескольких изменений в вашем коде, вот окончательный результат.Я добавил комментарии в код, чтобы помочь вам понять, что было изменено

import re
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
%matplotlib inline

def file_parsing(file_path):
    cnt = 0
    output_list = []
    edge_list = []
    with open(file_path, 'r') as fp:
        for line in fp:
            cnt += 1
            #checks for the room name and coordinates
            if re.match('([^\s#]{1,10}) (\d+) (\d+)', line, re.MULTILINE):
                output_list.append(line.strip().split(' '))
            #checks for start
            if line.startswith('##start'):
                output_list.append(next(fp, '').strip().split())
            #checks for start
            if line.startswith('##end'):
                output_list.append(next(fp, '').strip().split())

            # --------- Check for edges -----------#
            if '-' in line:
                src, dest = line.split('-')
                edge_list.append([src.strip(), dest.strip()])
    room_name = [item[0] for item in output_list]
    x_coord = [int(item[1]) for item in output_list]
    y_coord = [int(item[2]) for item in output_list]
    x_y = list(zip(x_coord, y_coord))
    pos_dict = dict(zip(room_name, x_y))

    return pos_dict, edge_list

room_pos_dict, edge_list = file_parsing('ex.txt')

G = nx.DiGraph()
G.add_nodes_from(room_pos_dict.keys())

#----------- Add edges from the edge list ------ 
G.add_edges_from(edge_list)

nx.set_node_attributes(G, room_pos_dict, 'pos')
nx.draw_networkx(G, pos=nx.get_node_attributes(G, 'pos'))

enter image description here

...