如何利用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
相关产品推荐
相关产品推荐

