如何更改networkx图中的节点位置?

问题描述

我想根据 networkx.DiGraph 的值更改 Dictionary 中的节点位置。

我的尝试:

1)首先我生成一个字典,其中 Keys 作为 Node 名称Value 作为 TuplesX 坐标的 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)

enter image description here

有什么问题?

  1. 正如你所看到的,这些职位并不是我定义的那样。
  2. 奇怪的是,当我用这个命令打印出 nodes属性时:pos = nx.get_node_attributes(G,'pos')。我可以在正确的位置看到我的所有职位。
  3. 如何让图表在所需位置绘制 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 布局算法来布局您的网络。