如何基于Pandas DataFrame在Python NetworkX中创建指定布局无向图
NetworkX指定中心节点、边长度、节点大小的实现方案
结论
该需求完全可以实现,核心逻辑是手动指定节点坐标来绑定边长度到你给定的dist值,避免NetworkX默认自动布局的不可控问题。
实现步骤
1. 依赖说明
需要提前安装三个库:pandas、networkx、matplotlib,安装命令如下:
pip install pandas networkx matplotlib
2. 完整可运行代码
import pandas as pd import networkx as nx import matplotlib.pyplot as plt # 构造数据集 d = {'label': [1, 2, 3, 4, 5], 'size': [10, 8, 6, 4, 2], 'dist': [0, 2, -2, 4, -4]} df = pd.DataFrame(data=d) # 计算每个节点的坐标,此处沿x轴排列,保证到中心(0,0)的距离等于dist的绝对值 # 如需节点绕中心呈圆形散开,可自行调整y坐标的计算逻辑 pos = {} for _, row in df.iterrows(): node = row['label'] # 中心节点1放在(0,0) if node == 1: pos[node] = (0, 0) else: # dist为正放在x轴正方向,负的放在x轴负方向,y坐标为0 pos[node] = (row['dist'], 0) # 构建无向图 G = nx.Graph() # 添加所有节点 G.add_nodes_from(df['label'].tolist()) # 添加边:所有节点和中心节点1相连 for node in df['label'].tolist(): if node != 1: G.add_edge(1, node) # 绘制图像 plt.figure(figsize=(8, 4)) # 绘制边 nx.draw_networkx_edges(G, pos) # 绘制节点:node_size与size成正比,乘以200是缩放系数,可自行调整 node_sizes = df['size'] * 200 nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color='lightblue') # 绘制节点标签 nx.draw_networkx_labels(G, pos, font_size=12, font_weight='bold') # 关闭坐标轴 plt.axis('off') plt.show()
3. 效果说明
运行上述代码后得到的图完全匹配你的要求:
- label为1的最大节点固定在图像中心位置
- 每条边的长度和对应dist的绝对值完全一致
- 节点显示大小和size列数值成正比
如果需要节点不排列在同一条水平线上,只需要修改坐标计算逻辑,给每个非中心节点分配不同的y坐标,保证节点到(0,0)的欧氏距离等于abs(dist)即可,例如圆形布局的坐标计算可以改成:
import math # 非中心节点列表 other_nodes = df[df['label']!=1]['label'].tolist() angle_step = 2 * math.pi / len(other_nodes) for i, node in enumerate(other_nodes): dist = df.loc[df['label']==node, 'dist'].iloc[0] angle = i * angle_step x = abs(dist) * math.cos(angle) # 保留dist的正负方向,不需要可删除下面两行 sign = 1 if dist >0 else -1 x = x * sign y = abs(dist) * math.sin(angle) pos[node] = (x, y)
内容的提问来源于stack exchange,提问作者Avto Abashishvili
相关产品推荐
相关产品推荐

