【Python NetworkX】图结构 图绘制
【Python NetworkX】图结构 & 图绘制
- 1. 简介 & 安装
- 1.1 简介
- 1.2 安装
- 1.3 导入
- 2. 图
- 2.1 无向图
- 2.2 有向图
- 2.3 重边无向图
- 2.4 重边有向图
- 2.5 图属性
- 3. 节点
- 3.1 添加节点
- 3.2 移除节点
- 3.3 节点属性
- 3.4 检查节点状态
- 4. 边
- 4.1 添加边
- 4.2 移除边
- 4.3 边属性
- 4.4 检查边状态
- 5. 图生成器
- 5.1 经典图
- 5.1.1 空白图
- 5.1.2 非连通图
- 5.1.3 全连通图
- 5.1.4 圆环图
- 5.1.5 梯形图
- 5.1.6 圆环梯形图
- 5.1.7 路径图
- 5.1.8 中心放射图/星图
- 5.1.9 轮子图
- 5.1.10 棒棒糖图
- 5.1.11 蝌蚪图
- 5.1.12 杠铃图
- 5.1.13 图兰图
- 5.1.14 多分部全连通图
- 5.2 随机图
- 5.2.1 规则随机图
- 5.2.2 壳随机图
- 5.2.3 K出度随机图
- 5.3 网格图
- 5.3.1 二维网格图
- 5.3.2 高维网格图
- 5.4 数独图
- 6. 图绘制
- 6.1 绘制简单图
- 6.1.1 绘制基础图
- 6.1.2 绘制完全图
- 6.2 绘制功能图
- 6.2.1 节点图
- 6.2.2 边图
- 6.2.3 节点标签图
- 6.2.4 边标签图
- ※ 绘图示例
- 6.3 绘制布局图
- 6.3.1 环形布局算法
- 6.3.2 平面布局算法
- 6.3.3 随机布局算法
- 6.3.4 谱布局算法
- 6.3.5 Fruchterman-Reingold布局算法
- 6.3.6 Kamada-Kawai弹簧嵌入布局算法
- 6.3.7 壳布局算法
- 6.3.8 二分布局算法
- 6.3.9 螺旋布局算法
- 6.3.10 多分布局算法
1. 简介 & 安装
1.1 简介
NetworkX是一个Python包,用于创建、操作和研究复杂网络的结构、动态和功能。
使用NetworkX能够以标准与非标准数据格式加载和存储网络,生成许多类型的随机和经典网络,分析网络结构、构建网络模型、设计新的网络算法、绘制网络 等等。
官网链接:NetworkX官网
官网文档链接:PDF简介 稳定版-用户手册
NetworkX官网提供稳定版和实验版两种版本。
1.2 安装
通过pip
命令安装 NetworkX
库
pip install networkx
1.3 导入
NetworkX
库的常用别名为nx
import networkx as nx
2. 图
Networkx 图类型 | 是否有向 | 是否允许自环 | 是否允许重合边 |
---|---|---|---|
Graph | 无向 | 允许自环 | 无重合边 |
DiGraph | 有向 | 允许自环 | 无重合边 |
MultiGraph | 无向 | 允许自环 | 有重合边 |
MultiDiGraph | 无向 | 允许自环 | 有重合边 |
2.1 无向图
创建空白无向图
创建空白无向图的代码如下,这种方式创建的图,添加路径时方向无效(1→2 = 2→1)。
G = nx.Graph()
创建路径无向图
H = nx.path_graph(10)
这样,我们就创建了一个名为H的路径结构。
图拓印
这种方式会 重置/清空 目标图中节点,分别拓印节点和边代码如下(若需全拓印等同于copy操作)。
# 创建10个节点的路径无向图
H = nx.path_graph(10)
# 拓印节点至目标图G中
G.add_nodes_from(H)
# 拓印边至目标图G中
G.add_edges_from(H)
图构成
利用邻接表快速构建图结构
adjacency_dict = {0: (1, 2), 1: (0, 2) , 2: (0, 1, 3)}
H = nx.Graph(adjacency_dict)
2.2 有向图
创建空白有向图
创建空白有向图的代码如下,这种方式创建的图,添加路径时需考虑方向(1→2 ≠ 2→1)。
G = nx.DiGraph()
无向图 转换 双向有向图
创建双向图时,可将无向图转为双向图,转换后所有边均为双向连接。
G = nx.Graph()
G.add_nodes_from([1, 2])
G.add_edge(1, 2)
H = nx.DiGraph(G)
图构成
利用邻接表快速构建图结构
adjacency_dict = {0: (1, 2), 1: (0, 2) , 2: (0, 1, 3)}
H = nx.DiGraph(adjacency_dict)
2.3 重边无向图
重边复合图 MultiGraph
允许在节点间多次添加相同的无向边。
无向重边复合图
MG = nx.MultiGraph()
为无向多边复合图添加相同起始点但权重不同的边。
MG = nx.MultiGraph()
MG.add_weighted_edges_from([(1, 2, 0.5), (1, 2, 0.75), (2, 3, 0.5)])
print(MG.edges())
查看重边图的权重
利用get_edge_data()
函数可查看边的权重。
print("1 -> 2: ", MG.get_edge_data(1, 2))
print("2 -> 3: ", MG.get_edge_data(2, 3))
2.4 重边有向图
重边复合图 MultiDiGraph
允许在节点间多次添加相同的有向边。
有向重边复合图
MG = nx.MultiDiGraph()
为有向多边复合图添加相同起始点但权重不同的边。
MG = nx.MultiDiGraph()
MG.add_weighted_edges_from([(1, 2, 0.5), (1, 2, 0.75), (2, 1, 0.5), (2, 3, 0.6)])
print(MG.edges())
查看重边图的权重
利用get_edge_data()
函数可查看边的权重。
print("1 -> 2: ", MG.get_edge_data(1, 2))
print("2 -> 3: ", MG.get_edge_data(2, 3))
2.5 图属性
创建时赋予
G = nx.Graph(day="Friday")
创建后追加/修改
G.graph['day'] = "Monday"
3. 节点
3.1 添加节点
添加节点有多种方式:逐个添加、按组添加、带属性按组添加、图节点传递。
逐个添加
G.add_node(1)
这种模式字符串保持不变。
G.add_node("abcd") # 添加名为abcd的节点
按组添加
G.add_nodes_from([2, 3])
这种模式字符串将被视为字符列表。
G.add_nodes_from("abcd") # 分别添加名为a、b、c、d的节点
带属性按组添加
G.add_nodes_from([(4, {"color": "red"}), (5, {"color": "green"})])
3.2 移除节点
逐个移除
G.remove_node(2)
这种模式字符串保持不变。
G.remove_node("abcd")
按组移除
G.remove_nodes_from([3, 4])
这种模式字符串将被视为字符列表。
G.remove_nodes_from("abcd")
3.3 节点属性
添加时赋予
G.add_node(1, time='5pm')
这种添加方式会为节点1和节点2均添加值为5pm的time属性。
G.add_nodes_from([1, 2], time='5pm')
列表、元组 均无法分别为节点1和节点2添加不同值的time属性,而是将集合值直接作为属性存储。
以下示例中,为二者赋予了值为['5pm', '6pm']
的time属性。
G.add_nodes_from([1, 2], time=['5pm', '6pm'])
正确的添加方式:利用字典分别添加。
G.add_nodes_from([(1, {'time': '5pm'}), (2, {'time': '6pm'})])
也可以添加不同的属性。
G.add_nodes_from([(1, {'time': '5pm'}), (2, {'date': '2025-03-15'})])
添加后追加/修改
G.nodes[1]['time'] = '2pm'
G.nodes[1]['room'] = 156
3.4 检查节点状态
获取节点数量
G.number_of_nodes()
查看所有节点
直接执行该方法,将获得networkx.classes.reportviews.NodeView
类型。
G.nodes # 5节点图执行结果:NodeView((1, 2, 3, 4, 5))
可以直接将其转化为列表,方便后续对节点数据的处理。
list(G.nodes)
查看节点属性
G.nodes.data()
4. 边
无向图执行边操作时无需考虑方向(1→2 = 2→1),而有向图必须考虑方向(1→2 ≠ 2→1)。
4.1 添加边
逐个添加
G.add_edge(1, 2)
G.add_edge(3, 'm') # 数字→字符
这种模式字符串保持不变。
G.add_edge("abcd") # abcd
元组添加
# 解包元组
e = (2, 3)
G.add_edge(*e)
按组添加
G.add_edges_from([(1, 2), (1, 3)])
这种模式字符串将被视为字符列表。
G.add_edge("abcd") # a b c d
添加带权重边
G.add_weighted_edges_from([(1, 2, 0.5), (2, 3, 0.5)])
4.2 移除边
逐个移除
G.remove_edge(1, 2)
G.remove_edge(3, 'm') # 数字→字符
这种模式字符串保持不变。
G.remove_edge("abcd") # abcd
元组移除
# 解包元组
e = (2, 3)
G.remove_edge(*e)
按组移除
G.remove_edges_from([(1, 2), (1, 3)])
这种模式字符串将被视为字符列表。
G.remove_edges_from("abcd") # a b c d
4.3 边属性
添加时赋予
G.add_edge(1, 2, weight=4.7 )
这种添加方式会为节点1和节点2均添加值为red的color属性。
G.add_edges_from([(3, 4), (4, 5)], color='red')
批量添加多种属性
G.add_edges_from([(1, 2, {'color': 'brown'}), (2, 3, {'color': 'blue'})])
G.add_edges_from([(1, 2, {'color': 'blue'}), (2, 3, {'weight': 8})])
添加后追加/修改
以下是两种等价的追加方式。
G[1][2]['weight'] = 4.7
G.edges[1, 2]['weight'] = 4.7
4.4 检查边状态
获取节点数量
G.number_of_edges()
查看所有节点
直接执行该方法,将获得networkx.classes.reportviews.EdgeView
类型。
G.edges # (1, 2)边图执行结果:EdgeView([(1, 2)])
可以直接将其转化为列表,方便后续对边数据的处理。
list(G.edges)
查看边属性
G.edges.data()
获取边权重
G.get_edge_data(1, 2)
5. 图生成器
5.1 经典图
名称 | 说明 |
---|---|
null_graph() | 空白图 |
empty_graph | 非连通图 |
complete_graph | 全连通图 |
cycle_graph | 圆环图 |
ladder_graph | 梯形图 |
circular_ladder_graph | 圆环梯形图(首尾相接) |
path_graph | 路径图(一条线) |
star_graph | 中心放射图/星图 |
wheel_graph | 轮子图 |
lollipop_graph | 棒棒糖图 |
tadpole_graph | 蝌蚪图 |
barbell_graph | 杠铃图 |
dorogovtsev_goltsev_mendes_graph | DGM图 |
turan_graph | 图兰图 |
complete_multipartite_graph | 全分层连通图 |
5.1.1 空白图
nx.null_graph(create_using=None) # 生成无点无边空白图
N = nx.null_graph()
nx.draw(N)
5.1.2 非连通图
nx.empty_graph(n=0, create_using=None, default=<class 'networkx.classes.graph.Graph'>)
n
:路径图节点个数/index- 整型数值:按0至n-1生成节点
- 可迭代对象:按元素生成节点
create_using
:图类型
E = nx.empty_graph(5)
nx.draw(E)
5.1.3 全连通图
nx.complete_graph(n, create_using=None)
n
:路径图节点个数/index- 整型数值:按0至n-1生成节点
- 可迭代对象:按元素生成节点
create_using
:图类型
G = nx.complete_graph(6)
nx.draw(G)
5.1.4 圆环图
nx.circulant_graph(n, offsets, create_using=None)
n
:图节点数offsets
:节点偏移量列表create_using
:图类型
C = nx.cycle_graph(5)
nx.draw(C)
5.1.5 梯形图
nx.ladder_graph(n, create_using=None)[source]
n
:图节点数 按0至2n生成节点create_using
:图类型
C = nx.ladder_graph(6)
nx.draw(C)
5.1.6 圆环梯形图
nx.circular_ladder_graph(n, create_using=None)
n
:图节点数 按0至2n生成节点create_using
:图类型
C = nx.circular_ladder_graph(6)
nx.draw(C)
5.1.7 路径图
nx.path_graph(n, create_using=None)
n
:路径图节点个数/index- 整型数值:按0至n-1构成路径
- 可迭代对象:按顺序构成路径
create_using
:图类型
P = nx.path_graph(5)
nx.draw(P)
5.1.8 中心放射图/星图
nx.star_graph(n, create_using=None)
n
:星图节点个数/index- 整型数值:中心节点-0 按0至n-1生成节点
- 可迭代对象:中心节点-第一个 index不允许重复 按可迭代对象生成节点
create_using
:图类型
S = nx.star_graph(5)
nx.draw(S)
5.1.9 轮子图
nx.wheel_graph(n, create_using=None)
n
:轮子图节点个数/index- 整型数值:中心节点-n 按0至n-1生成节点
- 可迭代对象:中心节点-第一个 index不允许重复 按可迭代对象生成节点
create_using
:图类型
W = nx.wheel_graph(10)
nx.draw(W)
5.1.10 棒棒糖图
nx.lollipop_graph(m, n, create_using=None)
m, n
:棒棒糖节点个数/index- 整型数值:m-(完全连通图)糖节点数 n-(路径)棒节点数
- ==可迭代对象:range(m), range(m, m+n)
- 可迭代对象: 糖棒index不允许重复 其他表现形式与整型数值类似
- 整型数值:m-(完全连通图)糖节点数 n-(路径)棒节点数
create_using
:图类型
L = nx.lollipop_graph(5, 5)
nx.draw(L)
5.1.11 蝌蚪图
nx.tadpole_graph(m, n, create_using=None)
m, n
:蝌蚪节点个数/index- 整型数值:m-(完全连通图)头节点数 n-(路径)尾节点数
- ==可迭代对象:range(m), range(m, m+n)
- 可迭代对象: 头尾index不允许重复 其他表现形式与整型数值类似
- 整型数值:m-(完全连通图)头节点数 n-(路径)尾节点数
create_using
:图类型
T = nx.tadpole_graph(5, 3)
nx.draw(T)
5.1.12 杠铃图
nx.barbell_graph(m1, m2, create_using=None)
m1
:左右杠铃尺寸 整型数值 要求 m 1 > 2 m1>2 m1>2m2
:连接杠铃路径长度 整型数值create_using
:图类型 默认且仅支持无向图
B = nx.barbell_graph(5, 3)
nx.draw(B)
5.1.13 图兰图
图兰图 T(n,r) 的定义为一个特殊的具有 n 点的完全r分图,其中各部分的顶点数的差不超过1。在所有 n 点且不包(r+1)-点团的图中,边数最多的图是图兰图。
nx.turan_graph(n, r)
n
:节点数量r
:分区数量- 取值要求: 1 ≤ r ≤ n 1 \le r \le n 1≤r≤n
TRG = nx.turan_graph(5, 2)
nx.draw(TRG)
5.1.14 多分部全连通图
多分部全连通图:除同部之间节点外 其余节点全部连接
nx.complete_multipartite_graph(*subset_sizes)
*subset_sizes
:- 整型数值:分部中每个子集的节点数
- 可迭代对象:分部中每个子集的节点
G = nx.complete_multipartite_graph(10, 5, 3)
nx.draw_networkx(G, pos=nx.multipartite_layout(G))
5.2 随机图
NetworkX允许创建多种随机图,这里我们介绍以下几种随机图。
名称 | 说明 |
---|---|
random_regular_graph | 已知度数+节点数 随机图 |
random_shell_graph | 已知壳层参数 随机图 |
random_k_out_graph | 已知出度k 随机图(含重边) |
5.2.1 规则随机图
依照节点数量与各节点度生成随机图,该图类型仅支持单边无向图,方法返回值为Graph
。
nx.random_regular_graph(d, n, seed=None, *, create_using=None)
d
:各节点的度 整型数值n
:节点数量 整型数值 要求 ( n × d ) % 2 = 0 (n×d)\%2=0 (n×d)%2=0 即相乘为偶数seed
:随机种子 整型数值/random_state/Nonecreate_using
:图类型 默认且仅支持单边无向图
举例:
RRG = nx.random_regular_graph(3, 6)
nx.draw(RRG)
5.2.2 壳随机图
生成多壳层间建立联系的随机图,该图类型仅支持单边无向图,方法返回值为Graph
。
nx.random_shell_graph(constructor, seed=None, *, create_using=None)
constructor
表示壳层的参数 从中心向外扩散 元素为三元组(n, m, d)的列表 n-本层节点数/m-本层连边数/d-与外层节点建立连边比例seed
:随机种子 整型数值/random_state/Nonecreate_using
:图类型 默认且仅支持单边无向图
举例:
RSG = nx.random_shell_graph(constructor=[(10, 30, 0), (10, 30, 0)])
nx.draw_shell(RSG, [list(range(10)), list(range(10, 20))])
由于不存在第三层,故第二层 30 × 0.8 = 24 30\times0.8=24 30×0.8=24条连边消失。
RSG = nx.random_shell_graph(constructor=[(10, 30, 0), (10, 30, 0.2)])
nx.draw_shell(RSG, [list(range(10)), list(range(10, 20))])
RSG = nx.random_shell_graph(constructor=[(10, 30, 0.2), (10, 30, 0)])
nx.draw_shell(RSG, [list(range(10)), list(range(10, 20))])
5.2.3 K出度随机图
生成已知出度为k的随机图,该图类型为有向重边图,方法返回值为MultiDiGraph
。
nx.random_k_out_graph(n, k, alpha, self_loops=True, seed=None)
n
:节点数 整型数值k
:图出度数k 整型数值alpha
:顶点初始权重 浮点型数值 越低越容易被选中(⭐与颜色无关)self_loop
:是否出现自环 布尔值 默认Trueseed
:随机种子 整型数值/random_state/None
生成步骤:
- 从一个空有向图开始,初始设置每个节点的权重为alpha。
- 均匀随机选择出度小于k的节点u。
- 选择一个与权重成比例的节点v。
- 添加一条从u到v的有向边,并将v的权重增加1。
- 若所有节点出度为k停止生成,否则返回步骤2重复执行。
5.3 网格图
名称 | 说明 |
---|---|
grid_2d_graph | 二维网格图 |
grid_graph | 高维网格图 (任意) |
5.3.1 二维网格图
nx.grid_2d_graph(m, n, periodic=False, create_using=None)
m, n
:网格图长宽 整型数值-range(n) / 可迭代对象-元素坐标creating_using
:图类型
指定坐标:
G = nx.grid_2d_graph([1, 3, 6 ,8], [1, 2], periodic=False, create_using=None)
nx.draw_networkx(G, pos=nx.spring_layout(G))
按顺序排列:
G = nx.grid_2d_graph(5, 5, periodic=False, create_using=None)
nx.draw_networkx(G, pos=nx.spring_layout(G))
5.3.2 高维网格图
nx.grid_graph(dim, periodic=False)
dim
:网格图各维长度 元组/列表 其元素:整型数值/可迭代对象
三维网格图
G = nx.grid_graph(dim=(2, 3, 4))
nx.draw_networkx(G, pos=nx.spring_layout(G))
伪 · 四维网格图
G = nx.grid_graph(dim=(2, 2, 2, 2))
nx.draw_networkx(G, pos=nx.spring_layout(G), node_size=100)
5.4 数独图
Sudoku图:一种与数独游戏相关的图结构,用于表示数独棋盘上的单元格之间的关系。
Sudoku图是一个无向图,三维Sudoku图包含81个顶点,每个顶点对应数独棋盘上的一个单元格。两个顶点(即两个单元格)是相邻的,如果它们位于同一行、列或3x3的格子中
基本属性:
- 节点数:节点数对应数独棋盘上的单元格。
- 边数:每个顶点与其他同行、同列或同格的顶点相连,因此每个顶点有20条边,总边数为1620条。
- 度数:每个顶点的度数为20,表示每个单元格与20个其他单元格相邻。
- 连通性:Sudoku图是一个连通图,因为数独棋盘上的所有单元格都通过行、列和格子相连。
nx.sudoku_graph(n=3)
n
:数独图顺序(=行数平方根) 整型数值 默认3
>>> G = nx.sudoku_graph()
>>> G.number_of_nodes()
81
>>> G.number_of_edges()
810
>>> sorted(G.neighbors(42))
[6, 15, 24, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, 44, 51, 52, 53, 60, 69, 78]
>>> G = nx.sudoku_graph(2)
>>> G.number_of_nodes()
16
>>> G.number_of_edges()
56
6. 图绘制
6.1 绘制简单图
NetworkX主要用于图结构分析,其绘图功能基于Matplotlib及Graphviz实现。
import networkx as nx
import matplotlib.pyplot as plt
6.1.1 绘制基础图
创建并绘制图结构数据。
G = nx.petersen_graph()
nx.draw(G, with_labels=True, font_weight='bold')
6.1.2 绘制完全图
方法参数:
nx.draw_networkx(G, pos=None, arrows=None, with_labels=True, **kwds)
G
:NetworkX图结构pos
:描述节点位置 字典类型 K-V : 节点-位置 默认弹簧嵌入布局arrows
:绘制箭头- None:有向图FancyArrowPath 无向图LineCollection
- True:全体FancyArrowPath(美观可弯曲)
- False:全体LineCollection(快速绘制)
arrowsize
:箭头大小 整型数值/列表 默认10with_labels
:是否为节点附着标签 布尔值ax
:所属Matplotlib子图 Matplotlib-Axes类型nodelist
:绘制指定节点 列表 默认全部节点edgelist
:绘制指定连边 列表 默认全部连边node_size
:节点大小 整型数值/列表 默认300node_color
:节点颜色 颜色/列表 默认’#1f78b4’alpha
:节点&连边 透明度 浮点型cmap
:连接强度颜色条 Matplotlib-Colormap 可选vmin, vmax
:最大&最小颜色条度量 浮点型 可选linewidths
:节点边框宽度 数值/列表 默认1.0width
:连边宽度 浮点型数值/列表 默认1.0edge_color
:连边颜色/长度与连边数量相等的颜色组 颜色/列表 可选edge_vmin, edge_vmax
:最大&最小颜色条度量 浮点型 可选style
:连边类型 字符串 ‘-’ / ‘–’ / ‘-.’ / ‘:’ / ‘solid’ / ‘dashed’(等同于Matplotlib中linestyle
)labels
:节点标签 字典类型 K-V:节点-标签font_size
:标签字号 整型数值 默认-节点12-连边10font_color
:标签字符颜色 颜色 默认黑色font_weight
:标签字符粗细 字符串 默认’normal’font_family
:标签字符集/字体 默认’sans-serif’label
:图例标签 字符串 可选hide_ticks
:隐藏坐标轴刻度 布尔值 可选
6.2 绘制功能图
我们均以下图结构数据为例:
G = nx.DiGraph()
G.add_edges_from([[1, 2], [2, 3], [3, 4], [4, 5], [1, 3], [2, 4], [3, 5]])
6.2.1 节点图
仅绘制包含节点的图结构,可与其他绘图类型叠加使用。
方法参数:
nx.draw_networkx_nodes(G, pos, nodelist=None, node_size=300, node_color='#1f78b4', node_shape='o', alpha=None, cmap=None, vmin=None, vmax=None, ax=None, linewidths=None, edgecolors=None, label=None, margins=None, hide_ticks=True)
G
:NetworkX图结构pos
:描述节点位置 字典类型 K-V : 节点-位置 默认弹簧嵌入布局ax
:所属Matplotlib子图 Matplotlib-Axes类型nodelist
:绘制指定节点 列表 默认全部节点node_size
:节点大小 整型数值/列表 默认300node_color
:节点颜色 颜色/列表 默认’#1f78b4’node_shape
:节点形状(等同于Matplotlib中scatter属性marker
)alpha
:节点 透明度 浮点型cmap
:节点强度颜色条 Matplotlib-Colormap 可选vmin, vmax
:最大&最小颜色条度量 浮点型 可选edgecolors
:节点颜色/长度与节点数量相等的颜色组 颜色/列表 可选label
:图例标签 字符串 可选margins
:轴自动缩放 浮点型数值 范围[0, 1]hide_ticks
:隐藏坐标轴刻度 布尔值 可选
6.2.2 边图
仅绘制包含连边的图结构,可与其他绘图类型叠加使用。
方法参数:
nx.draw_networkx_edges(G, pos, edgelist=None, width=1.0, edge_color='k', style='solid', alpha=None, arrowstyle=None, arrowsize=10, edge_cmap=None, edge_vmin=None, edge_vmax=None, ax=None, arrows=None, label=None, node_size=300, nodelist=None, node_shape='o', connectionstyle='arc3', min_source_margin=0, min_target_margin=0, hide_ticks=True)
G
:NetworkX图结构pos
:描述节点位置 字典类型 K-V : 节点-位置 默认弹簧嵌入布局edgelist
:绘制指定连边 列表 默认全部节点width
:连边宽度 浮点型数值/列表edge_color
:连边颜色/长度与连边数量相等的颜色组 颜色/列表 可选style
:连边类型 字符串 ‘-’ / ‘–’ / ‘-.’ / ‘:’ / ‘solid’ / ‘dashed’(等同于Matplotlib中linestyle
)alpha
:连边透明度 浮点型/数组edge_cmap
:连边颜色条 颜色条edge_vmin, edge_vmax
:连边最大&最小颜色条度量 浮点型 可选ax
:所属Matplotlib子图 Matplotlib-Axes类型arrows
:绘制箭头- None:有向图FancyArrowPath 无向图LineCollection
- True:全体FancyArrowPath(美观可弯曲)
- False:全体LineCollection(快速绘制)
arrowstyle
:箭头样式 有向图默认’ -|>‘|无向图默认’-’arrowsize
:箭头大小 整型数值/列表 默认10connectionstyle
:创建圆弧半径为rad的圆弧(源自matplotlib.patches.ConnectionStyle
与matplotlib.patches.FancyArrowPatch
)- 若Iterable, index表示MultiGraph的第i个边键
node_size
:节点大小 整型数值/列表 默认300nodelist
:绘制指定节点 列表 默认全部节点node_shape
:节点形状(等同于Matplotlib中scatter属性marker
)label
:图例标签 字符串 可选min_source_margin
:有向图源头与节点最小间距 整型数值/列表min_target_margin
:有向图箭头与节点最小间距 整型数值/列表hide_ticks
:隐藏坐标轴刻度 布尔值 可选
6.2.3 节点标签图
仅绘制包含节点标签的图结构,可与其他绘图类型叠加使用。
方法参数:
nx.draw_networkx_labels(G, pos, labels=None, font_size=12, font_color='k', font_family='sans-serif', font_weight='normal', alpha=None, bbox=None, horizontalalignment='center', verticalalignment='center', ax=None, clip_on=True, hide_ticks=True)
G
:NetworkX图结构pos
:描述节点位置 字典类型 K-V : 节点-位置 默认弹簧嵌入布局labels
:节点标签 仅绘制其中包含键的标签 字典类型font_size
:标签字号 整型数值 默认-节点12-连边10font_color
:标签字符颜色 颜色 默认黑色font_weight
:标签字符粗细 字符串 默认’normal’font_family
:标签字符集/字体 默认’sans-serif’alpha
:标签文字透明度 浮点型bbox
:连边标签文本框属性(形状/颜色) 默认{boxstyle=‘round’, ec=(1.0, 1.0, 1.0), fc=(1.0, 1.0, 1.0)}horizontalalignment
:水平对齐方式 ‘center’/‘right’/‘left’verticalalignment
:垂直对齐方式 ‘center’/‘top’/‘bottom’/‘baseline’/‘center_baseline’ax
:所属Matplotlib子图 Matplotlib-Axes类型clip_on
:在坐标轴边界处裁剪边缘标签 布尔值 默认Truehide_ticks
:隐藏坐标轴刻度 布尔值 可选
6.2.4 边标签图
仅绘制包含连边标签的图结构,可与其他绘图类型叠加使用。
方法参数:
nx.draw_networkx_edge_labels(G, pos, edge_labels=None, label_pos=0.5, font_size=10, font_color='k', font_family='sans-serif', font_weight='normal', alpha=None, bbox=None, horizontalalignment='center', verticalalignment='center', ax=None, rotate=True, clip_on=True, node_size=300, nodelist=None, connectionstyle='arc3', hide_ticks=True)[source]
G
:NetworkX图结构pos
:描述节点位置 字典类型 K-V : 节点-位置 默认弹簧嵌入布局edge_labels
:连边标签 仅绘制其中包含键的标签 字典类型label_pos
:连边标签位置 0->head/0.5->center/1->tail 默认0.5font_size
:标签字号 整型数值 默认-节点12-连边10font_color
:标签字符颜色 颜色 默认黑色font_weight
:标签字符粗细 字符串 默认’normal’font_family
:标签字符集/字体 默认’sans-serif’alpha
:标签文字透明度 浮点型bbox
:连边标签文本框属性(形状/颜色) 默认{boxstyle=‘round’, ec=(1.0, 1.0, 1.0), fc=(1.0, 1.0, 1.0)}horizontalalignment
:水平对齐方式 ‘center’/‘right’/‘left’verticalalignment
:垂直对齐方式 ‘center’/‘top’/‘bottom’/‘baseline’/‘center_baseline’ax
:所属Matplotlib子图 Matplotlib-Axes类型rotate
:是否旋转边缘标签使其与边缘平行 布尔值 默认Trueclip_on
:在坐标轴边界处裁剪边缘标签 布尔值 默认Truenodelist
:绘制指定节点 列表 默认全部节点connectionstyle
:创建圆弧半径为rad的圆弧(源自matplotlib.patches.ConnectionStyle
与matplotlib.patches.FancyArrowPatch
)- 若Iterable, index表示MultiGraph的第i个边键
hide_ticks
:隐藏坐标轴刻度 布尔值 可选
※ 绘图示例
① 导入三方库
import matplotlib.pyplot as plt
import networkx as nx
② 定义数据
G = nx.DiGraph()
G.add_nodes_from([1, 2, 3, 4, 5])
G.add_edges_from([[1, 2], [2, 3], [3, 4], [4, 5], [1, 3], [2, 4]])
labels = {
1: 'Me',
2: 'You',
}
edge_labels = {
(1, 2): 'A',
(2, 3): 'B',
(3, 4): 'C',
}
③ 逐步绘制图结构(图层叠加)
nx.draw_networkx_nodes(G, pos=nx.circular_layout(G))
nx.draw_networkx_labels(G, labels=labels, pos=nx.circular_layout(G), font_size=8)
nx.draw_networkx_edges(G, pos=nx.circular_layout(G))
nx.draw_networkx_edge_labels(G, edge_labels=edge_labels, pos=nx.circular_layout(G), font_size=10)
6.3 绘制布局图
我们均以下图结构数据为例:
G = nx.DiGraph()
G.add_edges_from([[1, 2], [2, 3], [3, 4], [4, 5], [1, 3], [2, 4], [3, 5]])
6.3.1 环形布局算法
环形布局将节点和边布局在一个圆形区域内,节点在一个圆环上均匀分布。
方法参数:
nx.draw_circular(G, **kwargs)
等效代码:
nx.draw(G, pos=nx.circular_layout(G), **kwargs)
核心方法:
nx.circular_layout(G, scale=1, center=None, dim=2)
G
:应用布局的NetworkX图结构scale
:缩放系数 数值 默认1center
:中心点坐标对 列表/元组dim
:布局尺寸 d i m ≥ 2 dim\ge2 dim≥2
示例:
draw_circular(G)
6.3.2 平面布局算法
平面布局要求图 没有边交叉地布置节点。
方法参数:
nx.draw_planar(G, **kwargs)
等效代码:
nx.draw(G, pos=nx.planar_layout(G), **kwargs)
核心方法:
nx.planar_layout(G, scale=1, center=None, dim=2)
G
:应用布局的NetworkX图结构scale
:缩放系数 数值 默认1center
:中心点坐标对 列表/元组dim
:布局尺寸 d i m ≥ 2 dim\ge2 dim≥2
示例:
nx.draw_planar(G)
6.3.3 随机布局算法
基于随机分布的节点位置布局,用于观察相同节点在不同位置的图结构。
方法参数:
nx.draw_random(G, **kwargs)
等效代码:
nx.draw(G, pos=nx.random_layout(G), **kwargs)
核心方法:
nx.random_layout(G, center=None, dim=2, seed=None)
G
:应用布局的NetworkX图结构center
:中心点坐标对 列表/元组dim
:布局尺寸seed
:随机种子/随机数生成器- 整型数值:随机数生成器使用的种子
- numpy.random.RandomState实例:随机数生成器
示例:
nx.draw_networkx(G, pos=nx.random_layout(G))
6.3.4 谱布局算法
基于拉普拉斯矩阵的谱分解来确定节点位置,即根据图的Laplace特征向量排列顶点,用于观察图的谱特性。
方法参数:
nx.draw_spectral(G, **kwargs)
等效代码:
nx.draw(G, pos=nx.spectral_layout(G), **kwargs)
核心方法:
nx.spectral_layout(G, weight='weight', scale=1, center=None, dim=2)
G
:应用布局的NetworkX图结构scale
:缩放系数 数值 默认1weight
:用于边权重数值的边属性 字符串 默认’weight’ None-所有权重均为1center
:中心点坐标对 列表/元组dim
:布局尺寸 整型数值
示例:
nx.draw_spectral(G)
6.3.5 Fruchterman-Reingold布局算法
基于一种经典的力导向布局算法,用Fruchterman-Reingold算法排列顶点。适用于大型规模的图,原理与Kamada-Kawai类似,但速度更快。
方法参数:
nx.draw_spring(G, **kwargs)
等效代码:
nx.draw(G, pos=nx.spring_layout(G), **kwargs)
核心方法:
nx.spring_layout(G, k=None, pos=None, fixed=None, iterations=50, threshold=0.0001, weight='weight', scale=1, center=None, dim=2, seed=None)
G
:应用布局的NetworkX图结构k
:节点最佳间距 浮点型数值 默认 1 n \frac{1}{\sqrt{n}} n1 n为节点数 k↑节点间距↑pos
:节点的初始位置 字典类型 K-V:节点-坐标列表/元组 None-随机fixed
:节点保持固定在初始位置 列表 不在G中的节点会被忽略 必须指定pos
iteration
:最大迭代次数 整型数值threshold
:节点位置变化的相对误差阈值 误差低于该值停止迭代 浮点型数值 默认1e-4weight
:用于边权重数值的边属性 字符串 数值表示各连边吸引力 默认’weight’ None-所有权重均为1scale
:缩放系数 数值 默认1center
:中心点坐标对 列表/元组dim
:布局尺寸 整型数值seed
:随机种子/随机数生成器- 整型数值:随机数生成器使用的种子
- numpy.random.RandomState实例:随机数生成器
示例:
nx.draw_spring(G)
6.3.6 Kamada-Kawai弹簧嵌入布局算法
基于一种经典的力导向布局算法,用Kamada-Kawai算法排列顶点。适用于中小型规模的图。
核心思想:节点连边被视作弹簧,计算其理想长度使得图的势能(能量)最小化。
- 连边理想长度:距离越远的节点间的理想距离越长。
- 能量函数:表示当前布局与理想布局的差异。
- 最小化能量:不断调整节点位置,使得连边更接近理想长度,能量函数最小化。
方法参数:
nx.draw_kamada_kawai(G, **kwargs)
等效代码:
nx.draw(G, pos=nx.kamada_kawai_layout(G), **kwargs)
核心方法:
nx.kamada_kawai_layout(G, dist=None, pos=None, weight='weight', scale=1, center=None, dim=2)
G
:应用布局的NetworkX图结构dist
:节点间最优距离的两级字典 按源节点和目标节点索引pos
:节点的初始位置 字典类型 K-V:节点-坐标列表/元组dim>=2
:环形布局dim=1
:线性布局
weight
:用于边权重数值的边属性 字符串 默认’weight’ None-所有权重均为1scale
:缩放系数 数值 默认1center
:中心点坐标对 列表/元组dim
:布局尺寸 整型数值
示例:
nx.draw_kamada_kawai(G)
6.3.7 壳布局算法
壳布局算法使得顶点在同心圆“壳”上分布,通过调整nlist
参数指定同心圆“壳”的分布。
方法参数:
nx.draw_shell(G, nlist=None, **kwargs)
等效代码:
nx.draw(G, pos=nx.shell_layout(G, nlist=nlist), **kwargs)
核心方法:
nx.shell_layout(G, nlist=None, rotate=None, scale=1, center=None, dim=2)
G
:应用布局的NetworkX图结构nlist
:每个shell的节点列表 元素为节点列表的列表rotate
:相邻shell起始位置的相对旋转角度scale
:缩放系数 数值 默认1center
:中心点坐标对 列表/元组dim
:布局尺寸 整型数值 仅限 d i m = 2 dim=2 dim=2
示例:
nx.draw_shell(G)
6.3.8 二分布局算法
二分布局在两条直线上定位节点。
核心代码:
nx.bipartite_layout(G, nodes, align='vertical', scale=1, center=None, aspect_ratio=1.3333333333333333)
G
:应用布局的NetworkX图结构nodes
:靠左/靠上显示节点(取自G)align
:节点排列方式 字符串’vertical’/‘horizontal’ 默认’vertical’scale
:缩放系数 数值 默认1center
:中心点坐标对 列表/元组aspect_ratio
:展示宽高比例 数值 默认4/3
示例:
G = nx.bipartite.gnmk_random_graph(4, 6, 10)
top = nx.bipartite.sets(G)[0]
nx.draw(G, pos=nx.bipartite_layout(G, top))
plt.show()
6.3.9 螺旋布局算法
螺旋布局将环形布局的单一可视化数据环延伸为螺旋结构,从而拥有更好的视觉效果。
核心代码:
nx.spiral_layout(G, scale=1, center=None, dim=2, resolution=0.35, equidistant=False)
G
:应用布局的NetworkX图结构scale
:缩放系数 数值 默认1center
:中心点坐标对 列表/元组dim
:布局尺寸 整型数值 仅限 d i m = 2 dim=2 dim=2resolution
:螺旋分布紧凑性 浮点型数值 数值↓紧凑↑ 默认0.35equidistant
:定位方式 布尔值 True-减小离中心角度定位/False-增加离中心距离定位
示例:
nx.draw_networkx(G, pos=nx.spiral_layout(G))
绘制路径图:
PG = nx.path_graph(30)
nx.draw_networkx(PG, pos=nx.spiral_layout(PG))
6.3.10 多分布局算法
适用于多分部全连通图的布局算法。
多分部全连通图:除同层之间节点外 其余节点全部连接。
核心代码:
nx.multipartite_layout(G, subset_key='subset', align='vertical', scale=1, center=None)
G
:应用布局的NetworkX图结构 仅限多分部全连通图complete_multipartite_graph
subset_key
:各部节点子集 默认’subset’- 字符串:G保留该部子集节点的属性
- 字典:K-V:层号-该部子集节点
align
:节点排列方式 字符串’vertical’/‘horizontal’ 默认’vertical’scale
:缩放系数 数值 默认1center
:中心点坐标对 列表/元组
示例:
G = nx.complete_multipartite_graph(10, 5, 3)
nx.draw_networkx(G, pos=nx.multipartite_layout(G))