基于Networkx实现指定距离阈值的节点连接与随机绘制
基于NetworkX实现二维平面内节点的距离感知连接
实现方案
要完成需求中的两个核心功能,我们需要给节点添加随机坐标属性,并基于距离阈值建立节点连接,以下是完整的代码实现:
完整代码
import networkx as nx import matplotlib.pyplot as plt import random import math # 初始化有向图(若需无向连接,替换为nx.Graph()) G = nx.DiGraph() # 接收用户输入参数 n_size = int(input("Please enter number of nodes: ")) M = float(input("Please enter the size of 2D plane (MxM): ")) R = float(input("Please enter the distance threshold R: ")) # 为每个节点生成MxM范围内的随机坐标,并添加到图中 pos = {} for node_id in range(n_size): G.add_node(node_id) # 生成0到M之间的随机x、y坐标 pos[node_id] = (random.random() * M, random.random() * M) # 遍历所有节点对,建立符合距离条件的连接 for i in range(n_size): for j in range(n_size): if i != j: # 跳过节点自环 # 计算两点间的欧氏距离 distance = math.hypot(pos[i][0] - pos[j][0], pos[i][1] - pos[j][1]) if distance <= R: G.add_edge(i, j) # 绘制带坐标的图 fig, ax = plt.subplots(figsize=(6, 6)) nx.draw(G, pos=pos, with_labels=True, font_weight='normal', node_size=500, ax=ax) # 设置坐标轴范围与平面大小一致 plt.xlim(0, M) plt.ylim(0, M) plt.axis('on') plt.show()
关键细节说明
- 坐标生成:通过
random.random()生成[0, M)范围内的随机坐标,存入pos字典,既作为节点位置属性,也用于绘图时的节点定位 - 距离判断:使用
math.hypot()计算欧氏距离,该函数直接返回两点间的直线距离,比手动计算平方根更简洁高效 - 连接逻辑:双重循环遍历所有节点对,排除自环后,若距离≤阈值R则添加有向边;如果需要无向连接,只需将
nx.DiGraph()替换为nx.Graph(),此时添加单边会自动生成双向连接
内容的提问来源于stack exchange,提问作者Waqas Ahmad
相关产品推荐
相关产品推荐

