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

基于NetworkX与Matplotlib的加权图可视化:解决节点重叠问题

解决NetworkX加权图节点重叠问题

我正在可视化一个加权图,节点对用逗号连接代表边,数值为边的强度,但运行代码后出现节点重叠的问题,代码如下:

import matplotlib.pyplot as plt
import networkx as nx

data = {
    ('A', 'B'): 0.71,
    ('M', 'B'): 0.67,
    ('N', 'B'): 0.64,
    ('A', 'O'): 0.62,
    ('O', 'B'): 0.60,
    ('N', 'O'): 0.53,
    ('M', 'O'): 0.46,
    ('A', 'N'): 0.18,
    ('M', 'N'): 0.11
}
G = nx.Graph()
for key, value in data.items():
    G.add_edge(*key, weight=value)
fig, axe = plt.subplots()
pos = nx.spring_layout(G, seed=123456)
nx.draw_networkx_nodes(G, pos, ax=axe)
nx.draw_networkx_edges(G, pos, ax=axe)
nx.draw_networkx_labels(G, pos, font_size=12, ax=axe)
nx.draw_networkx_edge_labels(G, pos, nx.get_edge_attributes(G, "weight"), ax=axe)

以下是几种解决节点重叠的实用方案:

  • 调整spring_layout的核心参数:spring_layout基于力导向算法,可通过k参数控制节点间的理想距离,数值越大节点越分散(比如k=0.6);还能设置scale参数缩放布局范围(比如scale=2),让整体布局更舒展。同时可以增大画布尺寸,给节点更多展示空间。
  • 切换其他布局算法:如果spring_layout效果不佳,可尝试更适合的布局:
    • nx.circular_layout():将节点均匀分布在圆周上,彻底避免重叠
    • nx.kamada_kawai_layout():基于路径长度优化布局,更贴合边的权重关系
    • nx.spectral_layout():利用图拉普拉斯特征向量生成布局,适合对称结构的图
  • 优化节点与标签显示:增大node_size参数(比如node_size=1200)让节点更醒目;调整nx.draw_networkx_labels的label_pos参数(比如label_pos=0.3),让标签稍微偏离节点,减少遮挡;还能根据边的权重调整边宽,让图的层次更清晰。
  • 过滤低权重边:图中部分边权重极低(如0.11、0.18),若这些边非核心展示内容,可过滤后再可视化,降低图的复杂度:
    filtered_data = {edge: weight for edge, weight in data.items() if weight > 0.5}
    G = nx.Graph()
    for key, value in filtered_data.items():
        G.add_edge(*key, weight=value)
    

修改后的示例代码

import matplotlib.pyplot as plt
import networkx as nx

data = {
    ('A', 'B'): 0.71,
    ('M', 'B'): 0.67,
    ('N', 'B'): 0.64,
    ('A', 'O'): 0.62,
    ('O', 'B'): 0.60,
    ('N', 'O'): 0.53,
    ('M', 'O'): 0.46,
    ('A', 'N'): 0.18,
    ('M', 'N'): 0.11
}
G = nx.Graph()
for key, value in data.items():
    G.add_edge(*key, weight=value)
fig, axe = plt.subplots(figsize=(8, 6))  # 增大画布尺寸
# 调整布局参数,增大节点间距
pos = nx.spring_layout(G, seed=123456, k=0.6, scale=2)
# 增大节点大小
nx.draw_networkx_nodes(G, pos, ax=axe, node_size=1200)
# 根据权重调整边宽,强化视觉层次
edge_weights = nx.get_edge_attributes(G, "weight").values()
nx.draw_networkx_edges(G, pos, ax=axe, width=[w*5 for w in edge_weights])
nx.draw_networkx_labels(G, pos, font_size=12, ax=axe)
# 调整边标签位置,减少遮挡
nx.draw_networkx_edge_labels(G, pos, nx.get_edge_attributes(G, "weight"), ax=axe, label_pos=0.3)
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 15:03:14