基于DataFrame使用NetworkX绘制节点边属性关联的加权图实现方法
基于NetworkX绘制指定规则加权图的实现方案
首先安装所需依赖:
pip install pandas networkx matplotlib
完整可运行代码
import pandas as pd import networkx as nx import matplotlib.pyplot as plt # 构造题目给出的DataFrame数据 df = pd.DataFrame({ 'id': ['id1', 'id2', 'id3', 'id4'], 'source': ['A', 'A', 'A', 'A'], 'Target': ['B', 'C', 'D', 'E'], 'Weight': [1, 2, 3, 4] }) # 初始化无向图对象 G = nx.Graph() # 批量添加带权重的边 for _, row in df.iterrows(): G.add_edge(row['source'], row['Target'], weight=row['Weight']) # 实现需求1:节点连接数越多尺寸越大 # 计算每个节点的度(即连接数) node_degree = dict(G.degree()) # 将度值缩放为合适的节点尺寸,缩放系数可按需调整 node_size = [v * 1000 for v in node_degree.values()] # 实现需求2:边权重越高线条越粗 # 提取所有边的权重,缩放为合适的线条宽度,缩放系数可按需调整 edge_width = [G[u][v]['weight'] * 2 for u, v in G.edges()] # 选择弹簧布局让节点分布更合理,固定seed保证每次运行布局一致 pos = nx.spring_layout(G, seed=42) # 依次绘制节点、节点标签、边、边权重标签 nx.draw_networkx_nodes(G, pos, node_size=node_size, node_color='lightblue') nx.draw_networkx_labels(G, pos, font_size=12) nx.draw_networkx_edges(G, pos, width=edge_width, edge_color='gray') edge_labels = nx.get_edge_attributes(G, 'weight') nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels) # 隐藏坐标轴 plt.axis('off') plt.show()
效果说明
- 节点A的连接数为4,是所有节点中最高的,因此节点尺寸远大于仅1个连接的B、C、D、E节点
- 边权重从A-E(权重4)到A-B(权重1)依次降低,对应边的线条也从粗到细变化
- 代码中的节点尺寸缩放系数1000、边宽度缩放系数2都可以根据实际画布大小和展示需求调整
内容的提问来源于stack exchange,提问作者Hadi
相关产品推荐
相关产品推荐

