使用networkX和matplotlib在python中的相同位置/坐标处绘制不同的图形

时间:2018-07-27 21:17:04

标签: python-3.x matplotlib networkx

图1:

邻接表:

2:[2、3、4、5、6、7、10、11、12、13、14]

3:[2、3、4、5、6、7、10、11、12、13、14]

5:[2、3、4、5、6、7、8、9]

图:

`import networkx as nx 
 G = nx.Graph() 
 G1 = nx.Graph() 
 import matplotlib.pyplot as plt 
 for i, j in adj_list.items():
     for k in j:
           G.add_edge(i, k)  
pos = nx.spring_layout(G) 
nx.draw(G, with_labels=True, node_size = 1000, font_size=20)
plt.draw() 
plt.figure() # To plot the next graph in a new figure
plt.show() `

Graph 1

在图2中,我消除了一些边缘并重新绘制了图,但是节点的位置正在改变,如何为下一张图存储节点的位置?

1 个答案:

答案 0 :(得分:0)

在绘制图形时,您需要重新使用pos变量。 nx.spring_layout返回一个字典,其中节点id是键,值是要绘制的节点的x,y坐标。只需重复使用相同的pos变量,并将其作为属性传递给nx.draw这样的函数

import networkx as nx 
import matplotlib.pyplot as plt
G = nx.Graph() 
G1 = nx.Graph()
adj_list = {2: [2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14],    
3: [2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14],    
5: [2, 3, 4, 5, 6, 7, 8, 9]}
import matplotlib.pyplot as plt 
for i, j in adj_list.items():
    for k in j:
        G.add_edge(i, k)  
pos = nx.spring_layout(G)   #<<<<<<<<<< Initialize this only once
nx.draw(G,pos=pos, with_labels=True, node_size = 1000, font_size=20)  #<<<<<<<<< pass the pos variable
plt.draw() 
plt.figure() # To plot the next graph in a new figure
plt.show()

enter image description here

现在,我将创建一个新图并仅添加一半的边缘

cnt = 0
G = nx.Graph()
for i, j in adj_list.items():
    for k in j:
        cnt+=1
        if cnt%2 == 0:
            continue
        G.add_edge(i, k)  

nx.draw(G,pos=pos, with_labels=True, node_size = 1000, font_size=20)  #<-- same pos variable is used
plt.draw() 
plt.figure() # To plot the next graph in a new figure
plt.show()

enter image description here 如您所见,仅添加了一半的边缘,并且节点位置仍然保持不变。