当前位置: 首页 > news >正文

【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_graphDGM图
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不允许重复 其他表现形式与整型数值类似
  • 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不允许重复 其他表现形式与整型数值类似
  • 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>2
  • m2:连接杠铃路径长度 整型数值
  • 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 1rn
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/None
  • create_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/None
  • create_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:是否出现自环 布尔值 默认True
  • seed:随机种子 整型数值/random_state/None

生成步骤:

  1. 从一个空有向图开始,初始设置每个节点的权重为alpha。
  2. 均匀随机选择出度小于k的节点u。
  3. 选择一个与权重成比例的节点v。
  4. 添加一条从u到v的有向边,并将v的权重增加1。
  5. 若所有节点出度为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:箭头大小 整型数值/列表 默认10
  • with_labels:是否为节点附着标签 布尔值
  • ax:所属Matplotlib子图 Matplotlib-Axes类型
  • nodelist:绘制指定节点 列表 默认全部节点
  • edgelist:绘制指定连边 列表 默认全部连边
  • node_size:节点大小 整型数值/列表 默认300
  • node_color:节点颜色 颜色/列表 默认’#1f78b4’
  • alpha:节点&连边 透明度 浮点型
  • cmap:连接强度颜色条 Matplotlib-Colormap 可选
  • vmin, vmax:最大&最小颜色条度量 浮点型 可选
  • linewidths:节点边框宽度 数值/列表 默认1.0
  • width:连边宽度 浮点型数值/列表 默认1.0
  • edge_color:连边颜色/长度与连边数量相等的颜色组 颜色/列表 可选
  • edge_vmin, edge_vmax:最大&最小颜色条度量 浮点型 可选
  • style:连边类型 字符串 ‘-’ / ‘–’ / ‘-.’ / ‘:’ / ‘solid’ / ‘dashed’(等同于Matplotlib中linestyle
  • labels:节点标签 字典类型 K-V:节点-标签
  • font_size:标签字号 整型数值 默认-节点12-连边10
  • font_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:节点大小 整型数值/列表 默认300
  • node_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:箭头大小 整型数值/列表 默认10
  • connectionstyle:创建圆弧半径为rad的圆弧(源自matplotlib.patches.ConnectionStylematplotlib.patches.FancyArrowPatch
    • 若Iterable, index表示MultiGraph的第i个边键
  • node_size:节点大小 整型数值/列表 默认300
  • nodelist:绘制指定节点 列表 默认全部节点
  • 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-连边10
  • font_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:在坐标轴边界处裁剪边缘标签 布尔值 默认True
  • hide_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.5
  • font_size:标签字号 整型数值 默认-节点12-连边10
  • font_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:是否旋转边缘标签使其与边缘平行 布尔值 默认True
  • clip_on:在坐标轴边界处裁剪边缘标签 布尔值 默认True
  • nodelist:绘制指定节点 列表 默认全部节点
  • connectionstyle:创建圆弧半径为rad的圆弧(源自matplotlib.patches.ConnectionStylematplotlib.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:缩放系数 数值 默认1
  • center:中心点坐标对 列表/元组
  • dim:布局尺寸 d i m ≥ 2 dim\ge2 dim2

示例:

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:缩放系数 数值 默认1
  • center:中心点坐标对 列表/元组
  • dim:布局尺寸 d i m ≥ 2 dim\ge2 dim2

示例:

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:缩放系数 数值 默认1
  • weight:用于边权重数值的边属性 字符串 默认’weight’ None-所有权重均为1
  • center:中心点坐标对 列表/元组
  • 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}} n 1 n为节点数 k↑节点间距↑
  • pos:节点的初始位置 字典类型 K-V:节点-坐标列表/元组 None-随机
  • fixed:节点保持固定在初始位置 列表 不在G中的节点会被忽略 必须指定pos
  • iteration:最大迭代次数 整型数值
  • threshold:节点位置变化的相对误差阈值 误差低于该值停止迭代 浮点型数值 默认1e-4
  • weight:用于边权重数值的边属性 字符串 数值表示各连边吸引力 默认’weight’ None-所有权重均为1
  • scale:缩放系数 数值 默认1
  • center:中心点坐标对 列表/元组
  • dim:布局尺寸 整型数值
  • seed:随机种子/随机数生成器
    • 整型数值:随机数生成器使用的种子
    • numpy.random.RandomState实例:随机数生成器

示例:

nx.draw_spring(G)

FR布局

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-所有权重均为1
  • scale:缩放系数 数值 默认1
  • center:中心点坐标对 列表/元组
  • 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:缩放系数 数值 默认1
  • center:中心点坐标对 列表/元组
  • 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:缩放系数 数值 默认1
  • center:中心点坐标对 列表/元组
  • 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:缩放系数 数值 默认1
  • center:中心点坐标对 列表/元组
  • dim:布局尺寸 整型数值 仅限 d i m = 2 dim=2 dim=2
  • resolution:螺旋分布紧凑性 浮点型数值 数值↓紧凑↑ 默认0.35
  • equidistant:定位方式 布尔值 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:缩放系数 数值 默认1
  • center:中心点坐标对 列表/元组

示例:

G = nx.complete_multipartite_graph(10, 5, 3)
nx.draw_networkx(G, pos=nx.multipartite_layout(G))

多分布局

http://www.dtcms.com/a/99356.html

相关文章:

  • 如何下载主流网站的视频和音频?(支持100+网站视频下载)
  • CAN 介绍
  • C语言 - 变量修饰关键字
  • 软件测试之接口测试
  • 【Git “reflog“ 命令详解】
  • Vue2 项目将网页内容转换为图片并保存到本地
  • 基于74LS192的十进制两位数正向计时器(proteus仿真)
  • pycharm找不到conda可执行文件解决办法
  • 【数据结构】并查集
  • 数据湖的崛起:从大数据到智能未来的钥匙
  • 嵌入式开发技术总结报告
  • 从呼叫中心到大模型赋能:客户服务的智能化跃迁与人机协同新范式
  • 第二章 机器学习概述(续)
  • Linux上位机开发实践(MPP平台的核心构成)
  • 【Linux网络与网络编程】02.初识Socket编程
  • ACL 访问控制列表配置命令2
  • 每日算法-250329
  • 注意力蒸馏技术
  • 深度学习处理时间序列(7)
  • Github 2025-03-28 Java开源项目日报Top10
  • 手机硬件检测详解:从版本信息到相机功能的全面指南
  • [Java微服务架构]7-1_事务处理——事务特性与本地事务
  • 【商城实战(101)】电商未来已来:新技术引领商城发展新航向
  • 查看显卡算力
  • 使用LangChain Agents构建Gradio及Gradio Tools(1)——LangChain Agent概念
  • RCE--解法
  • 基于SpringBoot的“医疗设备管理系统”的设计与实现(源码+数据库+文档+PPT)
  • MySQL源码学习系列(一)-- 环境准备及常用命令
  • 【LeetCode】—169.多数元素
  • Java基础-21-基本语法-封装