问题描述
我想根据 networkx.DiGraph
的值更改 Dictionary
中的节点位置。
我的尝试:
1)首先我生成一个字典,其中 Keys
作为 Node
名称,Value
作为 Tuples
和 X
坐标的 Y
和这个是我的结果:
{'Start': (2,2),'S0': (0,0),'S1': (1,'S2': (2,'S3': (3,'S4': (4,'S5': (5,'S6': (6,'S7': (7,'S8': (8,'S9': (9,'S10': (10,'S11': (11,'S12': (12,'S13': (13,'S14': (14,'S15': (15,'S16': (16,'S17': (17,'S18': (18,'S19': (19,'S20': (20,'S21': (21,'S22': (22,'S23': (23,'S24': (24,1),'S25': (25,'S26': (26,'S27': (27,'S28': (28,'S29': (29,3),'S30': (30,'S31': (31,'S32': (32,'S33': (33,'S34': (34,'S35': (35,'S36': (36,'S37': (37,'S38': (38,'S39': (39,'S40': (40,'S41': (41,'S43': (43,'S44': (44,'S45': (45,'S47': (47,'S48': (48,'S49': (49,'S50': (50,'S51': (51,'S42': (42,'S46': (46,'Finish': (2,2)}
2) 然后我从列表中生成 Nodes
并使用 G.add_nodes_from(nodes)
将其添加到图表中(下面是 nodes
列表):
['Start','S0','S1','S2','S3','S4','S5','S6','S7','S8','S9','S10','S11','S12','S13','S14','S15','S16','S17','S18','S19','S20','S21','S22','S23','S24','S25','S26','S27','S28','S29','S30','S31','S32','S33','S34','S35','S36','S37','S38','S39','S40','S41','S43','S44','S45','S47','S48','S49','S50','S51','S42','S46','Finish']
3) 最后但并非最不重要的是我生成边缘(数据太大,无法放在这里)。
4)然后我按照这个answer把它放在一起:
G = nx.DiGraph()
G.add_nodes_from(nodes) #Add nodes
#G.add_edges_from(edges) #DONT' use this line of code for reproduction
for node,pos in positions.items(): #Add Node positions
G.nodes[node]['pos'] = pos
5)当我绘制图表时,这就是我得到的:
nx.draw_shell(G,with_labels = True,node_size = 500)
有什么问题?
- 正如你所看到的,这些职位并不是我定义的那样。
- 奇怪的是,当我用这个命令打印出
nodes
的属性时:pos = nx.get_node_attributes(G,'pos')
。我可以在正确的位置看到我的所有职位。 - 如何让图表在所需位置绘制
Nodes
?
编辑:
- 将命令从
nx.draw_shell
更改为nx.draw
似乎没有帮助。
解决方法
您可以使用 draw_networkx
参数将位置字典(键是节点,值是二维坐标)传递给更通用的 pos
函数:
nx.draw_networkx(G,pos= positions,with_labels=True,node_color=node_color,node_size=500)
请注意,nx.draw_shell
将根据 shell 布局算法来布局您的网络。