NetworkX从scipy sparse matrix建图:半粗化边改为细线条方法
解决NetworkX从SciPy稀疏矩阵创建图时边“半粗化”的问题
嘿,这个问题我之前踩过坑!你看到的“半粗化”边其实不是线条样式的问题,本质是同一个节点对之间存在多条重复边——当用SciPy稀疏矩阵初始化NetworkX图时,默认会创建MultiGraph(支持多重边的图结构),如果你的稀疏矩阵里有多个相同的(i,j)非零条目(哪怕值相同或不同),这些都会被当成独立的边,画出来叠在一起就显得“变粗”了。
下面是几种快速解决的方法:
1. 创建图时直接避免多重边
在调用from_scipy_sparse_array(旧版本NetworkX用from_scipy_sparse_matrix)时,指定create_using=nx.Graph()参数——Graph是NetworkX的简单图结构,会自动合并重复的节点对,只保留单条边:
import networkx as nx from scipy.sparse import csr_matrix # 假设你的稀疏矩阵是sparse_mat G = nx.from_scipy_sparse_array(sparse_mat, create_using=nx.Graph()) nx.draw(G)
2. 转换已有的多重图为简单图
如果已经创建了MultiGraph,可以直接把它转换成Graph,自动合并重复边:
# 假设G是已有的MultiGraph G_simple = nx.Graph(G) nx.draw(G_simple)
3. 保留边权重的合并方式(可选)
如果你的稀疏矩阵里的非零值代表边的权重,想把重复边的权重相加,可以手动聚合:
G_weighted = nx.Graph() # 遍历多重图的所有边 for u, v, data in G.edges(data=True): # 取出权重,默认值为1 weight = data.get('weight', 1) if G_weighted.has_edge(u, v): # 已有边则累加权重 G_weighted[u][v]['weight'] += weight else: # 没有则新增边 G_weighted.add_edge(u, v, weight=weight) # 画图时如果不需要按权重显示粗细,直接绘制即可得到细线条 nx.draw(G_weighted)
你可以先验证一下是不是重复边的问题:对比G.number_of_edges()和len(set(G.edges())),如果前者大于后者,就说明确实存在多重边啦。
内容的提问来源于stack exchange,提问作者StatsSorceress
相关产品推荐
相关产品推荐

