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

Posted 水w

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 使用networkx绘制带权无向图和带权有向图,以及标注特定路径相关的知识,希望对你有一定的参考价值。

目录

一、图的创建

# 图的创建

# 图的方法

# networkx

二、networkx绘制带权无向图

三、networkx绘制带权有向图

四、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绘制带权无向图和带权有向图,以及标注特定路径的主要内容,如果未能解决你的问题,请参考以下文章

NetworkX:Python图与网络模型基础

python3 networkx

根据节点值为networkx中的节点绘制不同的颜色

python networkx绘制图

python networkx:绘制网络图

使用Python中NetworkX包绘制深度神经网络结构图