python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径
目錄
一、圖的創(chuàng)建
# 圖的創(chuàng)建
# 圖的方法
# networkx
二、networkx繪制帶權(quán)無向圖
三、networkx繪制帶權(quán)有向圖
四、networkx標(biāo)注特定路徑
一、圖的創(chuàng)建
Networkx很容易創(chuàng)建圖、向圖中添加頂點(diǎn)和邊、從圖中刪除頂點(diǎn)和邊,也可以查看、刪除頂點(diǎn)和邊的屬性。
# 圖的創(chuàng)建
類型:Graph()類、DiGraph()類、MultiGraph()類和MultiDiGraph() 類分別用來創(chuàng)建 無向圖、有向圖、多圖和有向多圖。
創(chuàng)建一個(gè)沒有節(jié)點(diǎn)和邊的空圖。
import networkx as nx import networkx as nx # 導(dǎo)入 NetworkX 工具包 # 創(chuàng)建 圖 G1 = nx.Graph() # 創(chuàng)建:空的 無向圖 G2 = nx.DiGraph() #創(chuàng)建:空的 有向圖 G3 = nx.MultiGraph() #創(chuàng)建:空的 多圖 G4 = nx.MultiDiGraph() #創(chuàng)建:空的 有向多圖# 圖的方法
# networkx
NetworkX 是一個(gè)進(jìn)行復(fù)雜圖形網(wǎng)絡(luò)分析的 Python 軟件包。要了解 NetworkX 功能,首先需要了解圖形。圖形是一種數(shù)學(xué)結(jié)構(gòu),用于對物理、生物、社會(huì)和信息系統(tǒng)中多種類型的關(guān)系和過程進(jìn)行建模。圖形由通過邊緣連接(表示這些實(shí)體之間的關(guān)系)的節(jié)點(diǎn)或頂點(diǎn)(表示系統(tǒng)實(shí)體)構(gòu)成。圖形處理是一種能夠穿梭各邊緣和節(jié)點(diǎn)的功能,用于發(fā)現(xiàn)和理解網(wǎng)絡(luò)中關(guān)聯(lián)數(shù)據(jù)之間的復(fù)雜關(guān)系和/或優(yōu)化路徑。
其中,nx.draw() 和 nx.draw_networkx() 是最基本的繪圖函數(shù),并可以通過自定義函數(shù)屬性或其它繪圖函數(shù)設(shè)置不同的繪圖要求。
?
二、networkx繪制帶權(quán)無向圖
import matplotlib.pyplot as plt # 導(dǎo)入 Matplotlib 工具包 import networkx as nx # 導(dǎo)入 NetworkX 工具包# 問題 2:無向圖的最短路問題(司守奎,數(shù)學(xué)建模算法與應(yīng)用,P43,例4.3) G2 = nx.Graph() # 創(chuàng)建無向圖 G2.add_weighted_edges_from([(1, 2, 2), (1, 3, 8), (1, 4, 1),(2, 3, 6), (2, 5, 1),(3, 4, 7), (3, 5, 5), (3, 6, 1), (3, 7, 2),(4, 7, 9),(5, 6, 3), (5, 8, 2), (5, 9, 9),(6, 7, 4), (6, 9, 6),(7, 9, 3), (7, 10, 1),(8, 9, 7), (8, 11, 9),(9, 10, 1), (9, 11, 2),(10, 11, 4)]) # 向圖中添加多條賦權(quán)邊: (node1,node2,weight)# 兩個(gè)指定頂點(diǎn)之間的最短加權(quán)路徑 minWPath_v1_v5 = nx.dijkstra_path(G2, source=1, target=5) # 頂點(diǎn) 0 到 頂點(diǎn) 3 的最短加權(quán)路徑 print("頂點(diǎn) v1 到 頂點(diǎn) v5 的最短加權(quán)路徑: ", minWPath_v1_v5) # 兩個(gè)指定頂點(diǎn)之間的最短加權(quán)路徑的長度 lMinWPath_v1_v5 = nx.dijkstra_path_length(G2, source=1, target=5) # 最短加權(quán)路徑長度 print("頂點(diǎn) v1 到 頂點(diǎn) v5 的最短加權(quán)路徑長度: ", lMinWPath_v1_v5) # === 關(guān)注 Youcans 原創(chuàng)系列(https://blog.csdn.net/youcans)=== pos = nx.spring_layout(G2) # 用 FR算法排列節(jié)點(diǎn) nx.draw(G2, pos, with_labels=True, alpha=0.5) labels = nx.get_edge_attributes(G2, 'weight') nx.draw_networkx_edge_labels(G2, pos, edge_labels=labels) plt.show()?
?
三、networkx繪制帶權(quán)有向圖
import matplotlib.pyplot as plt # 導(dǎo)入 Matplotlib 工具包 import networkx as nx # 導(dǎo)入 NetworkX 工具包# 問題 2:無向圖的最短路問題(司守奎,數(shù)學(xué)建模算法與應(yīng)用,P43,例4.3) G2 = nx.DiGraph() # 創(chuàng)建:空的 有向圖G2.add_edge(1, 2, weight=1) # 添加 帶權(quán)邊,weight表示邊權(quán) G2.add_edge(5, 3, weight=7) G2.add_edge(2, 3, weight=4) G2.add_edge(3, 4, weight=3) G2.add_edge(7, 9, weight=4) G2.add_edge(3, 5, weight=5) G2.add_edge(4, 7, weight=9)# 兩個(gè)指定頂點(diǎn)之間的最短加權(quán)路徑 minWPath_v1_v5 = nx.dijkstra_path(G2, source=1, target=5) # 頂點(diǎn) 0 到 頂點(diǎn) 3 的最短加權(quán)路徑 print("頂點(diǎn) v1 到 頂點(diǎn) v5 的最短加權(quán)路徑: ", minWPath_v1_v5) # 兩個(gè)指定頂點(diǎn)之間的最短加權(quán)路徑的長度 lMinWPath_v1_v5 = nx.dijkstra_path_length(G2, source=1, target=5) # 最短加權(quán)路徑長度 print("頂點(diǎn) v1 到 頂點(diǎn) v5 的最短加權(quán)路徑長度: ", lMinWPath_v1_v5) # === 關(guān)注 Youcans 原創(chuàng)系列(https://blog.csdn.net/youcans)=== pos = nx.spring_layout(G2) # 用 FR算法排列節(jié)點(diǎn) nx.draw(G2, pos, with_labels=True, alpha=0.5) labels = nx.get_edge_attributes(G2, 'weight') nx.draw_networkx_edge_labels(G2, pos, edge_labels=labels) plt.show()?
四、networkx標(biāo)注特定路徑
import matplotlib.pyplot as plt # 導(dǎo)入 Matplotlib 工具包 import networkx as nx # 導(dǎo)入 NetworkX 工具包# 問題 2:無向圖的最短路問題(司守奎,數(shù)學(xué)建模算法與應(yīng)用,P43,例4.3) G2 = nx.DiGraph() # 創(chuàng)建:空的 有向圖G2.add_edge(1, 2, weight=1) # 添加 帶權(quán)邊,weight表示邊權(quán) G2.add_edge(5, 3, weight=7) G2.add_edge(2, 3, weight=4) G2.add_edge(3, 4, weight=3) G2.add_edge(7, 9, weight=4) G2.add_edge(3, 5, weight=5) G2.add_edge(4, 7, weight=9)# 兩個(gè)指定頂點(diǎn)之間的最短加權(quán)路徑 minWPath_v1_v5 = nx.dijkstra_path(G2, source=1, target=5) # 頂點(diǎn) 0 到 頂點(diǎn) 3 的最短加權(quán)路徑 print("頂點(diǎn) v1 到 頂點(diǎn) v5 的最短加權(quán)路徑: ", minWPath_v1_v5) # 兩個(gè)指定頂點(diǎn)之間的最短加權(quán)路徑的長度 lMinWPath_v1_v5 = nx.dijkstra_path_length(G2, source=1, target=5) # 最短加權(quán)路徑長度 print("頂點(diǎn) v1 到 頂點(diǎn) v5 的最短加權(quán)路徑長度: ", lMinWPath_v1_v5) # === 關(guān)注 Youcans 原創(chuàng)系列(https://blog.csdn.net/youcans)=== pos = nx.spring_layout(G2) # 用 FR算法排列節(jié)點(diǎn) nx.draw(G2, pos, with_labels=True, alpha=0.5) labels = nx.get_edge_attributes(G2, 'weight') nx.draw_networkx_edge_labels(G2, pos, edge_labels=labels) # plt.show()edgeList = [] for i in range(len(minWPath_v1_v5)-1):edgeList.append((minWPath_v1_v5[i], minWPath_v1_v5[i+1])) nx.draw_networkx_edges(G2, pos, edgelist=edgeList, edge_color='m', width=4) # 設(shè)置邊的顏色 plt.show() # YouCans, XUPT總結(jié)
以上是生活随笔為你收集整理的python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ant设置国际化设置为中文
- 下一篇: 随机森林模型及案例(Python)