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

基于NetworkX的节点连接聚类可视化优化问询

图聚类可视化优化方案

问题背景

手上有描述数据集条目关联的节点连接列表,每条记录是一对关联节点(权重统一设为1),想用NetworkX构建图并可视化相似条目集群,但遇到两个问题:

  • 小样本可视化时节点分布零散,看不出聚类效果
  • 数千节点的真实数据集可视化时节点严重重叠,无法辨识各集群的节点数量

连接列表样本:

smallSample = 
[[0, 1492, 1],
 [12, 937, 1],
 [16, 989, 1],
 [18, 371, 1],
 [18, 1140, 1],
 [26, 398, 1],
 [26, 1061, 1],
 [30, 1823, 1],
 [33, 1637, 1],
 [54, 1047, 1],
 [63, 565, 1]]

原NetworkX绘图代码:

import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
for index, row in CC.iterrows():
      G.add_edge(CC['source'].loc[index],CC['target'].loc[index], weight =1)
pos = nx.spring_layout(G, seed=7)
nx.draw_networkx_nodes(G, pos, node_size=5)
nx.draw_networkx_edges(G, pos, edgelist=G.edges(), width=0.5)
pos = nx.spring_layout(G, k=1, iterations=200)
plt.figure(3, figsize=(2000,2000), dpi =2) 

优化方法

1. 调整布局参数增强聚类紧凑性

spring_layout的k参数控制节点间距离,手动调小k可以让集群更紧凑;增加iterations次数让布局更稳定。也可以尝试kamada_kawai_layout,它更注重保持节点间的最短路径距离,适合展示聚类:

# 调整spring_layout参数
pos = nx.spring_layout(G, seed=7, k=0.15, iterations=500)  # 调小k值,增加迭代次数

# 尝试Kamada-Kawai布局
pos = nx.kamada_kawai_layout(G)

2. 先识别聚类再着色区分

用NetworkX的Louvain社区检测算法先识别出各个集群,给不同集群的节点赋予不同颜色,直观区分边界:

from networkx.algorithms.community import louvain_communities

# 识别社区
communities = louvain_communities(G, seed=7)
# 给每个节点分配社区ID
node_to_community = {}
for idx, comm in enumerate(communities):
    for node in comm:
        node_to_community[node] = idx
# 提取节点颜色
node_colors = [node_to_community[node] for node in G.nodes()]

# 绘图时指定颜色
nx.draw_networkx_nodes(G, pos, node_size=30, node_color=node_colors, cmap=plt.cm.tab10)

3. 优化节点与边的显示参数

  • 调整节点大小:统一设置node_size为20-50,避免过小看不清或过大重叠
  • 调小边宽并增加透明度:避免边遮挡节点,提升可读性
  • 关闭坐标轴:减少冗余元素
nx.draw_networkx_nodes(G, pos, node_size=30, node_color=node_colors, cmap=plt.cm.tab10)
nx.draw_networkx_edges(G, pos, width=0.2, alpha=0.6)  # alpha控制边的透明度
plt.axis("off")

4. 大样本数据集的特殊优化

对于数千节点的图,Matplotlib渲染能力有限,可尝试以下方案:

  • 用Graphviz布局:将图转换为Graphviz格式,用neato或fdp布局渲染,更适合处理大图
  • 交互式可视化:使用PyVis生成可缩放、拖拽的交互式网页,方便查看细节
from pyvis.network import Network

net = Network(notebook=True, height="800px", width="100%")
net.from_nx(G)
# 给节点添加社区颜色
for node in net.nodes:
    node["color"] = plt.cm.tab10(node_to_community[int(node["id"])])[:3]
net.show("graph.html")

5. 修正原代码逻辑问题

原代码重复计算布局、画布创建位置错误,修正后的基础代码:

import networkx as nx
import matplotlib.pyplot as plt
from networkx.algorithms.community import louvain_communities

G = nx.Graph()
# 用smallSample构建图(真实数据集替换为CC数据)
for source, target, _ in smallSample:
    G.add_edge(source, target, weight=1)

# 识别社区并分配颜色
communities = louvain_communities(G, seed=7)
node_to_community = {node: idx for idx, comm in enumerate(communities) for node in comm}
node_colors = [node_to_community[node] for node in G.nodes()]

# 创建画布并绘图
plt.figure(figsize=(12, 12), dpi=100)
pos = nx.spring_layout(G, seed=7, k=0.15, iterations=500)
nx.draw_networkx_nodes(G, pos, node_size=30, node_color=node_colors, cmap=plt.cm.tab10)
nx.draw_networkx_edges(G, pos, width=0.2, alpha=0.6)
plt.axis("off")
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:26:27