You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用CSV的edge_attr_1_number设置NetworkX边厚度与节点大小

实现自定义边粗细与节点大小的NetworkX绘图

先修正原代码中pos未定义的错误,再按需求实现边粗细和节点大小的自定义逻辑:

步骤1:计算节点总权重(节点大小依据)

需要统计每个节点作为起点(from)和终点(to)时,edge_attr_1_number的总和,以此作为节点大小的基准:

# 将from和to列转成长格式,方便分组求和
melted = pd.melt(data, id_vars=['edge_attr_1_number'], value_vars=['from', 'to'], value_name='node')
# 按节点分组求和,转成字典格式方便后续调用
node_weights = melted.groupby('node')['edge_attr_1_number'].sum().to_dict()

步骤2:提取边权重(边粗细依据)

直接从图的边属性中读取edge_attr_1_number,为了让粗细差异更直观,可给数值乘以一个放大系数:

# 提取每条边的属性值,乘以2放大粗细(系数可按需调整)
edge_widths = [G[u][v]['edge_attr_1_number'] * 2 for u, v in G.edges()]

步骤3:完整绘图代码(统一布局+自定义样式)

先计算节点布局位置,再分别绘制节点、边和标签,确保所有元素使用同一布局:

import networkx as nx
import pandas as pd
import matplotlib.pyplot as plt

# 读取CSV数据
data = pd.read_csv(r"C:\Users\n.philip\Documents\test_mine.csv", sep=";")
# 从DataFrame构建图,保留边属性
G = nx.from_pandas_edgelist(data, source='from', target='to', edge_attr=True)

# 计算节点总权重,转化为节点大小(乘以100放大视觉效果)
melted = pd.melt(data, id_vars=['edge_attr_1_number'], value_vars=['from', 'to'], value_name='node')
node_weights = melted.groupby('node')['edge_attr_1_number'].sum().to_dict()
node_sizes = [node_weights[node] * 100 for node in G.nodes()]

# 提取并放大边的粗细
edge_widths = [G[u][v]['edge_attr_1_number'] * 2 for u, v in G.edges()]

# 计算节点布局(seed固定布局,方便重复查看)
pos = nx.spring_layout(G, seed=42)

# 依次绘制节点、边、标签
nx.draw_networkx_nodes(G, pos, node_color='Green', node_size=node_sizes)
nx.draw_networkx_edges(G, pos, width=edge_widths)
nx.draw_networkx_labels(G, pos, font_size=12)

plt.show()

关键说明

  • 节点大小:通过将from和to列转长格式分组求和,得到节点的总关联权重,再乘以放大系数(100)让大小差异更明显,系数可按需调整。
  • 边的粗细:直接读取边属性值并放大,避免数值过小时边过于纤细,放大系数可根据实际视觉效果调整。
  • 固定布局:给spring_layout设置seed参数,确保每次绘图的节点位置一致,方便调试和对比。

内容的提问来源于stack exchange,提问作者Nathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 09:05:33