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()
改动说明
- 用列表推导式收集所有符合条件的节点,确保
large_nodes和small_nodes是完整的节点集合。 - 把
edgelist改成nodelist,正确指定要绘制的节点列表。 - 修正节点大小的对应关系,符合你提出的规则。
- 去掉了冗余的
nx.draw(G, layout),改成先画边再画节点,避免图层覆盖问题。 - 给不同大小的节点加了不同颜色,方便区分(你可以根据需要调整颜色)。
内容的提问来源于stack exchange,提问作者trav78
相关产品推荐
相关产品推荐

