python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径
Posted 水w
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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() #创建:空的 有向多图
# 图的方法
# 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()
三、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()
四、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
networkx网络拓扑节点图和树,python
首先需要安装networkx:
pip install networkx
绘制图和树节点的拓扑图需要matplotlib,也需要安装:
pip install matplotlib
一个代码例子:
import networkx as nx
import matplotlib.pyplot as plt
def my_grap():
G = nx.Graph(my_seq='first_graph')
G.add_node('a', my_index='NO-1')
G.add_nodes_from(['b', 'c'], my_index='NO-2/3')
G.add_nodes_from(['d', 'e', 'f'])
nx.add_cycle(G, ['d', 'e', 'f'])
G.add_edge('c', 'd', weight=3)
G.add_edges_from([('a', 'b', {'weight': 1}),
('a', 'd', {'weight': 2}),
('d', 'e', {'weight': 2}),
('d', 'f', {'weight': 2}),
('e', 'f', {'weight': 2})],
my_len=3)
G.nodes['e']['my_index'] = 'NO-4'
print('所有节点', G.nodes(data=True))
print('所有边', G.edges(data=True))
print('节点数', G.number_of_nodes())
# 打印所有边
for u, v, w in G.edges(data='weight'):
print((u, v, w))
pos = nx.spring_layout(G)
nx.draw(G, pos,
node_color='red',
node_size=300,
font_size=10,
font_color='blue',
with_labels=True)
weights = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=weights)
plt.show()
if __name__ == '__main__':
my_grap()
绘制出来的网络节点图为:
输出的日志为:
所有节点 [('a', {'my_index': 'NO-1'}), ('b', {'my_index': 'NO-2/3'}), ('c', {'my_index': 'NO-2/3'}), ('d', {}), ('e', {'my_index': 'NO-4'}), ('f', {})]
所有边 [('a', 'b', {'my_len': 3, 'weight': 1}), ('a', 'd', {'my_len': 3, 'weight': 2}), ('c', 'd', {'weight': 3}), ('d', 'e', {'my_len': 3, 'weight': 2}), ('d', 'f', {'my_len': 3, 'weight': 2}), ('e', 'f', {'my_len': 3, 'weight': 2})]
节点数 6
('a', 'b', 1)
('a', 'd', 2)
('c', 'd', 3)
('d', 'e', 2)
('d', 'f', 2)
('e', 'f', 2)
以上是关于python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径的主要内容,如果未能解决你的问题,请参考以下文章