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


研究中經常涉及到圖論的相關知識,而且常常面對某些術語時,根本不知道在說什么.前不久接觸了NetworkX這個graph處理工具,發現這個工具已經解決絕大部分的圖論問題(也許只是我自己認為的,沒有證據證明),所以把這個工具的使用學習下,順便學習圖論的相關知識.

NetworkX本來是有官方文檔的,花時間去學也是可以的,我這里把認為重要的整理出來.這些內容會分幾次發布,做成一個系列使用教程.

系統環境:

linuxmint 18.3
python 3.5.2
numpy 1.14.3
matplotlib 1.5.1
networkx 2.1

全文注意事項:

1.為了方便,graph我有時候會稱為,這時候不要將這個和圖片混淆了.
2.代碼中會頻繁使用G.clear(),這是在畫新的graph之前,先清空原先的graph
3.matplotlib包不能顯示平行邊,自循環這類的邊,所以需要借助pydot包來顯示,不過一般使用matplotlib來顯示


目錄:

1.創建一個Graph

例子:
下面涉及的graph如果不是特別需要,我將使用圖1這個手動創建的graph,這個graph有雙向邊,有孤島節點,有平行邊,有自循環

圖1 例子圖
圖1 例子圖

1.1導入相應包,定義graph

  1. #導入相應的包 
  2. import networkx as nx 
  3. from PIL import Image 
  4. import matplotlib.pyplot as plt 
  5. from networkx.drawing.nx_pydot import to_pydot 
  6. from matplotlib.font_manager import *  
  7.  
  8. #定義自定義字體,文件名從1.b查看系統中文字體中來,這是Linux字體路徑,windows系統的字體路徑自查 
  9. myfont = FontProperties(fname='/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc')  
  10. #解決負號'-'顯示為方塊的問題  
  11. matplotlib.rcParams['axes.unicode_minus']=False  
  12.  
  13. #定義圖的節點和邊 
  14. nodes=['0','1','2','3','4','5','a','b','c'] 
  15. 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)] 
  16.  
  17. #用於顯示圖片 
  18. def ShowGraph(G): 
  19. #使用pydot保存圖片 
  20. P=to_pydot(G)  
  21. P.write_jpeg('pydot.png') 
  22.  
  23. #使用matplotlib保存圖片 
  24. pos=nx.shell_layout(G) 
  25. nx.draw(G,pos,with_labels=True) 
  26. plt.savefig('mat.png') 
  27. plt.close()  
  28.  
  29. #將前面兩張圖顯示 
  30. plt.subplots(figsize=(12,6)) 
  31. #plt.suptitle('Diffrent') 
  32. #載入matplotlib的圖片 
  33. plt.subplot(1,2,1) 
  34. plt.title('matplotlib') 
  35. plt.imshow(Image.open('mat.png')) 
  36. #plt.axis('off') 
  37. #去掉坐標刻度 
  38. plt.xticks([]) 
  39. plt.yticks([]) 
  40.  
  41. #載入pydot的圖片 
  42. plt.subplot(1,2,2) 
  43. plt.title('pydot') 
  44. plt.imshow(Image.open('pydot.png')) 
  45. #plt.axis('off') 
  46. #去掉坐標刻度 
  47. plt.xticks([]) 
  48. plt.yticks([]) 
  49.  
  50. #顯示圖片 
  51. plt.show()  

1.2有自循環的無向圖

  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
有自循環的無向圖

1.3有自循環的有向圖

  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
有自循環的有向圖

1.4有自循環和平行邊的無向圖

  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
有自循環和平行邊的無向圖

1.5有自循環和平行邊的有向圖

  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
有自循環和平行邊的有向圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM