NetworkX系列教程(1)-创建graph

研究中经常涉及到图论的相关知识,而且常常面对某些术语时,根本不知道在说什么.前不久接触了NetworkX这个graph处理工具,发现这个工具已经解决绝大部分的图论问题(也许只是我自己认为的,没有证据证明),所以把这个工具的使用学习下,顺便学习图论的相关知识.

NetworkX本来是有官方文档的,花时间去学也是可以的,我这里把认为重要的整理出来.这些内容会分几次发布,做成一个系列使用教程.

例子:
下面涉及的graph如果不是特别需要,我将使用图1这个手动创建的graph,这个graph有双向边,有孤岛节点,有平行边,有自循环

图1 例子图
图1 例子图

全文注意事项:

1.为了方便,graph我有时候会称为,这时候不要将这个和图片混淆了.
2.代码中会频繁使用G.clear(),这是在画新的graph之前,先清空原先的graph
3.matplotlib包不能显示平行边,自循环这类的边,所以需要借助pydot包来显示,不过一般使用matplotlib来显示


目录:

1.创建一个Graph

  1. from networkx.drawing.nx_pydot import to_pydot 
  2.  
  3. #定义图的节点和边 
  4. nodes=['0','1','2','3','4','5','a','b','c'
  5. edges=[('0','0',1),('0','1',1),('0','5',1),('0','5',2),('1','2',3),('1','4',5),('2','1',7),('2','4',6),('a','b',0.5),('b','c',0.5),('c','a',0.5)] 
  6.  
  7. #用于显示图片 
  8. def ShowGraph(G): 
  9. #使用pydot保存图片 
  10. P=to_pydot(G)  
  11. P.write_jpeg('pydot.png'
  12.  
  13. #使用matplotlib保存图片 
  14. pos=nx.shell_layout(G) 
  15. nx.draw(G,pos,with_labels=True
  16. plt.savefig('mat.png'
  17. plt.close()  
  18.  
  19. #将前面两张图显示 
  20. plt.subplots(figsize=(12,6)) 
  21. #plt.suptitle('Diffrent') 
  22. #载入matplotlib的图片 
  23. plt.subplot(1,2,1
  24. plt.title('matplotlib'
  25. plt.imshow(Image.open('mat.png')) 
  26. #plt.axis('off') 
  27. #去掉坐标刻度 
  28. plt.xticks([]) 
  29. plt.yticks([]) 
  30.  
  31. #载入pydot的图片 
  32. plt.subplot(1,2,2
  33. plt.title('pydot'
  34. plt.imshow(Image.open('pydot.png')) 
  35. #plt.axis('off') 
  36. #去掉坐标刻度 
  37. plt.xticks([]) 
  38. plt.yticks([]) 
  39.  
  40. #显示图片 
  41. plt.show()  

1.1带有自循环的无向图

  1. #定义无向图 
  2. G = nx.Graph() 
  3.  
  4. #往图添加节点和边 
  5. G.add_nodes_from(nodes) 
  6. G.add_weighted_edges_from(edges) 
  7.  
  8. #显示图片 
  9. ShowGraph(G) 

png
png

1.2有自循环的有向图

  1. #清除前面的无向图 
  2. G.clear() 
  3.  
  4. #定义有向图 
  5. G = nx.DiGraph() 
  6. #添加节点和边 
  7. G.add_nodes_from(nodes) 
  8. G.add_weighted_edges_from(edges) 
  9.  
  10. #显示图片 
  11. ShowGraph(G) 

png
png

1.3带有自循环和平行边的无向图

  1. #清除前面的无向图 
  2. G.clear() 
  3.  
  4. #定义带平行边无向图 
  5. G = nx.MultiGraph() 
  6. #添加节点和边 
  7. G.add_nodes_from(nodes) 
  8. G.add_weighted_edges_from(edges) 
  9.  
  10. #显示图片 
  11. ShowGraph(G) 

png
png

1.4有自循环和平行边的有向图

  1. #清除前面的无向图 
  2. G.clear() 
  3.  
  4. #定义带平行边有向图 
  5. G = nx.MultiDiGraph() 
  6. #添加节点和边 
  7. G.add_nodes_from(nodes) 
  8. G.add_weighted_edges_from(edges) 
  9.  
  10. #显示图片 
  11. ShowGraph(G) 

png
png

猜你喜欢

转载自www.cnblogs.com/wushaogui/p/9199726.html
今日推荐