研究中經常涉及到圖論
的相關知識,而且常常面對某些術語時,根本不知道在說什么.前不久接觸了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導入相應包,定義graph
- #導入相應的包
- import networkx as nx
- from PIL import Image
- import matplotlib.pyplot as plt
- from networkx.drawing.nx_pydot import to_pydot
- from matplotlib.font_manager import *
- #定義自定義字體,文件名從1.b查看系統中文字體中來,這是Linux字體路徑,windows系統的字體路徑自查
- myfont = FontProperties(fname='/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc')
- #解決負號'-'顯示為方塊的問題
- matplotlib.rcParams['axes.unicode_minus']=False
- #定義圖的節點和邊
- nodes=['0','1','2','3','4','5','a','b','c']
- 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)]
- #用於顯示圖片
- def ShowGraph(G):
- #使用pydot保存圖片
- P=to_pydot(G)
- P.write_jpeg('pydot.png')
-
- #使用matplotlib保存圖片
- pos=nx.shell_layout(G)
- nx.draw(G,pos,with_labels=True)
- plt.savefig('mat.png')
- plt.close()
-
- #將前面兩張圖顯示
- plt.subplots(figsize=(12,6))
- #plt.suptitle('Diffrent')
- #載入matplotlib的圖片
- plt.subplot(1,2,1)
- plt.title('matplotlib')
- plt.imshow(Image.open('mat.png'))
- #plt.axis('off')
- #去掉坐標刻度
- plt.xticks([])
- plt.yticks([])
-
- #載入pydot的圖片
- plt.subplot(1,2,2)
- plt.title('pydot')
- plt.imshow(Image.open('pydot.png'))
- #plt.axis('off')
- #去掉坐標刻度
- plt.xticks([])
- plt.yticks([])
-
- #顯示圖片
- plt.show()
1.2有自循環的無向圖
- #定義無向圖
- G = nx.Graph()
- #往圖添加節點和邊
- G.add_nodes_from(nodes)
- G.add_weighted_edges_from(edges)
- #顯示圖片
- ShowGraph(G)

有自循環的無向圖
1.3有自循環的有向圖
- #清除前面的無向圖
- G.clear()
- #定義有向圖
- G = nx.DiGraph()
- #添加節點和邊
- G.add_nodes_from(nodes)
- G.add_weighted_edges_from(edges)
- #顯示圖片
- ShowGraph(G)

有自循環的有向圖
1.4有自循環和平行邊的無向圖
- #清除前面的無向圖
- G.clear()
- #定義帶平行邊無向圖
- G = nx.MultiGraph()
- #添加節點和邊
- G.add_nodes_from(nodes)
- G.add_weighted_edges_from(edges)
- #顯示圖片
- ShowGraph(G)

有自循環和平行邊的無向圖
1.5有自循環和平行邊的有向圖
- #清除前面的無向圖
- G.clear()
- #定義帶平行邊有向圖
- G = nx.MultiDiGraph()
- #添加節點和邊
- G.add_nodes_from(nodes)
- G.add_weighted_edges_from(edges)
- #顯示圖片
- ShowGraph(G)

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