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

二分图可视化技术求助:NetworkX绘制带边权重厚度的图

解决NetworkX绘制加权图边厚度问题的方案

你的代码没有利用边的权重信息控制边宽度,所以所有边显示为同一粗细。以下是具体解决思路和修改后的实现:

核心修改逻辑

  1. 从读取的图中提取每条边的权重值
  2. 将权重映射为合适的边宽度(可选归一化处理,避免权重范围过大导致显示异常)
  3. 在绘图时通过width参数传入边宽度列表

修改后的完整代码

import networkx as nx
import matplotlib.pyplot as plt

# 修正Windows路径转义问题,用双反斜杠或正斜杠
G = nx.read_weighted_edgelist('D:\\TS2VG\\Manga_network_data\\Static\\Static_One_Piece.edgelist')

# 提取所有边的权重属性
edge_weights = [G[u][v]['weight'] for u, v in G.edges()]

# 归一化权重到1-10的范围,让边宽差异更合理
min_w = min(edge_weights)
max_w = max(edge_weights)
normalized_widths = [1 + 9 * (w - min_w) / (max_w - min_w) for w in edge_weights]

# 用力导向布局替代随机布局,更贴合网络关联结构
pos = nx.spring_layout(G, seed=42)  # seed固定布局,方便重复生成相同结果

# 绘制带权重边的图
nx.draw(
    G, pos,
    with_labels=True,
    width=normalized_widths,  # 用归一化后的权重控制边宽
    node_size=600,
    font_size=7,
    node_color='#a6c96a'
)

plt.show()

关键细节说明

  • 路径处理:Windows系统中\是转义字符,必须改为\\或/,否则会导致文件路径解析错误
  • 权重提取:read_weighted_edgelist会自动将权重存储为边的weight属性,通过G[u][v]['weight']即可获取
  • 归一化处理:如果原始权重数值范围过大(比如从1到1000),直接用作边宽会导致细边几乎看不见、粗边过粗,归一化后能让所有边的粗细差异更直观
  • 布局选择:spring_layout基于力导向算法,会让关联紧密的节点聚集在一起,比random_layout更能体现漫画角色的社交关联结构

进阶精细控制(可选)

如果需要更灵活的绘图控制,可以分开绘制节点、边和标签:

# 单独绘制节点
nx.draw_networkx_nodes(G, pos, node_size=600, node_color='#a6c96a')
# 单独绘制带权重的边
nx.draw_networkx_edges(G, pos, width=normalized_widths, edge_color='#555555', alpha=0.7)
# 单独绘制标签
nx.draw_networkx_labels(G, pos, font_size=7, font_weight='bold')

plt.axis('off')  # 关闭坐标轴,优化视觉效果
plt.tight_layout()  # 自动调整布局,避免标签被截断
plt.show()

内容的提问来源于stack exchange,提问作者Dinh Duc Vu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:46:16