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

Networkx绘制不同大小节点图报错排查:带权重的度中心性应用

问题排查:基于权重的度中心性绘制差异化节点大小的网络图

嘿,我帮你揪出代码里的几个关键问题,这些问题会导致你的节点大小设置失效或者显示异常:

核心错误点

  • 变量赋值错误:你循环里的large和small每次只会保存最后一个符合条件的节点,而不是所有符合条件的节点集合。比如如果有3个节点度>4,最后large只会是第三个节点,前面的都被覆盖了。
  • 参数使用错误:nx.draw_networkx_nodes用来指定节点列表的参数是nodelist,不是edgelist——你写的edgelist是用来指定边的,这里完全用错了参数名。
  • 节点大小规则搞反:你的需求是度中心性>4设为1500,<4设为500,但代码里给large(度>4的节点)设了node_size=100,给small设了1500,完全和需求相反。
  • 重复绘制节点:开头的nx.draw(G, layout)会先绘制一批默认大小的节点,后面再画差异化节点会重叠在一起,导致显示混乱。

修正后的代码

import matplotlib.pyplot as plt
import networkx as nx
import numpy as np

A = [[0, 1.51, 0, 1.71, 0], [0, 0, 2.11, 1.81, 2.31], [0, 0, 0, 1.31, 1.41], [0, 0, 0, 0, 1.11], [0, 0, 0, 0, 0]]
G = nx.from_numpy_matrix(np.matrix(A), create_using=nx.DiGraph)
layout = nx.spring_layout(G)
labels = nx.get_edge_attributes(G, "weight")

# 节点标签映射
raw_labels = ["A1", "K2", "D3", "E4", "Z30"]
lab_node = dict(zip(G.nodes, raw_labels))

print("Degree centrality weight")
d = G.degree(weight='weight')
print(d)

# 收集符合条件的节点列表
large_nodes = [node for node, degree in d if degree > 4]
small_nodes = [node for node, degree in d if degree < 4]

# 先画边(避免节点覆盖边)
nx.draw_networkx_edges(G, layout)

# 绘制不同大小的节点
nx.draw_networkx_nodes(G, layout, nodelist=large_nodes, node_size=1500, node_color='lightblue')
nx.draw_networkx_nodes(G, layout, nodelist=small_nodes, node_size=500, node_color='lightgreen')

# 添加边标签和节点标签
nx.draw_networkx_edge_labels(G, layout, edge_labels=labels)
nx.draw_networkx_labels(G, layout, labels=lab_node, font_size=10, font_family='sans-serif')

plt.show()

改动说明

  1. 用列表推导式收集所有符合条件的节点,确保large_nodes和small_nodes是完整的节点集合。
  2. 把edgelist改成nodelist,正确指定要绘制的节点列表。
  3. 修正节点大小的对应关系,符合你提出的规则。
  4. 去掉了冗余的nx.draw(G, layout),改成先画边再画节点,避免图层覆盖问题。
  5. 给不同大小的节点加了不同颜色,方便区分(你可以根据需要调整颜色)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:17:36