NetworkX布局算法:nx.spring_layout

诸神缄默不语-个人CSDN博文目录

官方文档:https://networkx.org/documentation/stable/reference/generated/networkx.drawing.layout.spring_layout.html

nx.fruchterman_reingold_layout()等价。

这个函数主要是为了在可视化NetworkX图时设置节点分布布局的,应该是最常用的画图布局,因为我前几年做GNN的时候几乎看的所有可视化代码用的都是这个函数……
本文会首先介绍布局原理,但其实不太重要,可以直接看代码部分。

1. 布局原理

理念是为了好看。
目标是在二维/三维图中可视化图,①边等长。②边尽量不交叉。
优势是不需要图论知识(如平面性概念)。

使用Fruchterman-Reingold force-directed algorithm
模拟物理系统。
基于边/节点之间的相关关系,设置边/节点之间的力,然后模拟边/节点的移动来最小化熵(能量),从而得到一个相对稳定的布局。
通常使用Spring Embedding Algorithm,基于胡克定律的类似弹簧的吸引力用于相互吸引的图形中边的端点,同时使用基于库仑定律的带电粒子的排斥力来分隔所有节点对。节点之间的弹簧力和斥力共同作用,决定了节点的最终位置。弹簧力试图将相连的节点拉近,而斥力则试图将所有节点推开。通过迭代计算,节点的位置不断调整,直到系统达到平衡状态或满足预设的迭代次数。
在该力系统的平衡状态下,边的长度往往是一致的(因为弹簧引力),而没有通过边连接的节点往往会被拉开得更远(因为电荷斥力)。

2. 代码实现

1. 示例

以一个简单的无向图为例:

import networkx as nx
import matplotlib.pyplot as plt

# 创建一个无向图
G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3), (2, 4), (3, 4), (4, 5)])

# 生成布局
pos = nx.spring_layout(G, k=0.15, iterations=20)

# 绘制图形
nx.draw_networkx(G, pos, with_labels=True, node_color="lightblue", edge_color="gray")
plt.show()

输出图像:
在这里插入图片描述

2. 参数

  1. k:节点间的最优距离,越大,节点之间离得越远
  2. iterations:最大算法迭代次数
  3. seed:初始化的随机种子

参考资料

  1. spring_layout — NetworkX 3.4.2 documentation
  2. 力导向图 - 维基百科,自由的百科全书
  3. 平面图 (图论) - 维基百科,自由的百科全书
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸神缄默不语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值