python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径

目录


一、图的创建

Networkx很容易创建图、向图中添加顶点和边、从图中删除顶点和边,也可以查看、删除顶点和边的属性。

# 图的创建

类型:Graph()类、DiGraph()类、MultiGraph()类和MultiDiGraph() 类分别用来创建 无向图、有向图、多图和有向多图。

创建一个没有节点和边的空图。

import networkx as nx
import networkx as nx  # 导入 NetworkX 工具包
# 创建 图
G1 = nx.Graph()  # 创建:空的 无向图
G2 = nx.DiGraph()  #创建:空的 有向图
G3 = nx.MultiGraph()  #创建:空的 多图
G4 = nx.MultiDiGraph()  #创建:空的 有向多图

# 图的方法

python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径

# networkx

NetworkX 是一个进行复杂图形网络分析的 Python 软件包。要了解 NetworkX 功能,首先需要了解图形。图形是一种数学结构,用于对物理、生物、社会和信息系统中多种类型的关系和过程进行建模。图形由通过边缘连接(表示这些实体之间的关系)的节点或顶点(表示系统实体)构成。图形处理是一种能够穿梭各边缘和节点的功能,用于发现和理解网络中关联数据之间的复杂关系和/或优化路径。

其中,nx.draw() 和 nx.draw_networkx() 是最基本的绘图函数,并可以通过自定义函数属性或其它绘图函数设置不同的绘图要求。

 

二、networkx绘制带权无向图

import matplotlib.pyplot as plt  # 导入 Matplotlib 工具包
import networkx as nx  # 导入 NetworkX 工具包

# 问题 2:无向图的最短路问题(司守奎,数学建模算法与应用,P43,例4.3)
G2 = nx.Graph()  # 创建无向图
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)])  # 向图中添加多条赋权边: (node1,node2,weight)


# 两个指定顶点之间的最短加权路径
minWPath_v1_v5 = nx.dijkstra_path(G2, source=1, target=5)  # 顶点 0 到 顶点 3 的最短加权路径
print("顶点 v1 到 顶点 v5 的最短加权路径: ", minWPath_v1_v5)
# 两个指定顶点之间的最短加权路径的长度
lMinWPath_v1_v5 = nx.dijkstra_path_length(G2, source=1, target=5)  # 最短加权路径长度
print("顶点 v1 到 顶点 v5 的最短加权路径长度: ", lMinWPath_v1_v5)
# === 关注 Youcans 原创系列(https://blog.csdn.net/youcans)===
pos = nx.spring_layout(G2)  # 用 FR算法排列节点
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()

python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径

python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径 

 

三、networkx绘制带权有向图

import matplotlib.pyplot as plt  # 导入 Matplotlib 工具包
import networkx as nx  # 导入 NetworkX 工具包

# 问题 2:无向图的最短路问题(司守奎,数学建模算法与应用,P43,例4.3)
G2 = nx.DiGraph()  # 创建:空的 有向图

G2.add_edge(1, 2, weight=1)  # 添加 带权边,weight表示边权
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)

# 两个指定顶点之间的最短加权路径
minWPath_v1_v5 = nx.dijkstra_path(G2, source=1, target=5)  # 顶点 0 到 顶点 3 的最短加权路径
print("顶点 v1 到 顶点 v5 的最短加权路径: ", minWPath_v1_v5)
# 两个指定顶点之间的最短加权路径的长度
lMinWPath_v1_v5 = nx.dijkstra_path_length(G2, source=1, target=5)  # 最短加权路径长度
print("顶点 v1 到 顶点 v5 的最短加权路径长度: ", lMinWPath_v1_v5)
# === 关注 Youcans 原创系列(https://blog.csdn.net/youcans)===
pos = nx.spring_layout(G2)  # 用 FR算法排列节点
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()

python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径

python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径

 

四、networkx标注特定路径

import matplotlib.pyplot as plt  # 导入 Matplotlib 工具包
import networkx as nx  # 导入 NetworkX 工具包

# 问题 2:无向图的最短路问题(司守奎,数学建模算法与应用,P43,例4.3)
G2 = nx.DiGraph()  # 创建:空的 有向图

G2.add_edge(1, 2, weight=1)  # 添加 带权边,weight表示边权
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)

# 两个指定顶点之间的最短加权路径
minWPath_v1_v5 = nx.dijkstra_path(G2, source=1, target=5)  # 顶点 0 到 顶点 3 的最短加权路径
print("顶点 v1 到 顶点 v5 的最短加权路径: ", minWPath_v1_v5)
# 两个指定顶点之间的最短加权路径的长度
lMinWPath_v1_v5 = nx.dijkstra_path_length(G2, source=1, target=5)  # 最短加权路径长度
print("顶点 v1 到 顶点 v5 的最短加权路径长度: ", lMinWPath_v1_v5)
# === 关注 Youcans 原创系列(https://blog.csdn.net/youcans)===
pos = nx.spring_layout(G2)  # 用 FR算法排列节点
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)  # 设置边的颜色
plt.show()  # YouCans, XUPT

python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年3月5日 下午7:15
下一篇 2023年3月5日 下午7:16

相关推荐