我正在尝试获取正在放入图中的所有节点的位置。当前的目标是创建所有具有x
和y
坐标的节点。
我正在阅读的内容是关于使用add_nodes_from()
时的属性,并可能为我的节点创建位置属性。对我来说,阅读一些文档和另一个StackOverflow并不成功。
ex.txt文件:
a2a 5 0
##start
a0 1 2
##end
a1 9 2
3 5 4
python文件:
import re
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
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))
return (room_name, output_list, x_y)
rooms, room_coords, xpos_ypos = file_parsing('ex.txt')
print("Room information: ", room_coords)
print("X and Y position as tuple list: ", xpos_ypos)
DG = nx.DiGraph()
DG.add_nodes_from(rooms, pos = xpos_ypos)
pos = nx.get_node_attributes(DG, 'pos')
print(pos)
plt.figure()
nx.draw_networkx(DG)
如您所见,我的xpos_ypos
放在一个拉链中,该拉链创建一个元组列表。而且我的迭代顺序很重要,因为第一个房间将从第一个元组开始具有x和y坐标。
例如,我的第一个房间是a2a
,坐标为(5, 0)
。如果a0
,房间(1, 2)
将具有坐标。现在,如果要一遍又一遍地为每个房间做同样的事情:如何将房间坐标属性添加到每个房间?就我而言,我得到的是字典:
{'a2a': [(5, 0), (1, 2), (9, 2), (5, 4)], 'a0': [(5, 0), (1, 2), (9, 2), (5, 4)], 'a1': [(5, 0), (1, 2), (9, 2), (5, 4)], '3': [(5, 0), (1, 2), (9, 2), (5, 4)]}
,这是输出draw_networkx(DG)
:
答案 0 :(得分:1)
您的代码不起作用,因为您传递的位置不正确。
我对您的函数进行了一些更改,以便它返回一个字典,字典以键作为节点名,值作为[x, y]
坐标。像这样
{'a2a': (5, 0), 'a0': (1, 2), 'a1': (9, 2), '3': (5, 4)}
然后,我从返回的字典和上面的字典创建图形到pos
函数的nx.draw_networkx
属性。
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))
#--------------Changes start from here -----------#
pos_dict = dict(zip(room_name, x_y))
return pos_dict
room_pos_dict = file_parsing('ex.txt')
G = nx.Graph()
G.add_nodes_from(room_pos_dict.keys())
nx.set_node_attributes(G, room_pos_dict, 'pos')
nx.draw_networkx(G, pos=nx.get_node_attributes(G, 'pos'))