如何使用Networkx绘制仅含高中心度Top节点的网络图
代码失效原因
原有代码无法得到预期结果,核心问题有3个:
- 传入绘图函数的是全量图对象,即便指定
nodelist参数,绘图逻辑仍会带出和列表内节点相连的非目标节点,不会自动过滤无关节点、边 - 布局坐标
nx.spring_layout(graph)基于全量节点计算,核心节点位置会被大量非核心节点干扰,布局松散错位 - 代码存在变量名错误:读入数据存为
df,建图时却传入了未定义的data变量
可直接运行的修正代码
import pandas as pd import networkx as nx import matplotlib.pyplot as plt # 读取边表数据建图 df = pd.read_csv("替换为你的文件实际路径.csv") full_graph = nx.from_pandas_edgelist(df, source="source", target="target") # 计算中心度,取排名前20的核心节点,可替换为任意中心度指标 centrality = nx.eigenvector_centrality(full_graph) top20_core_nodes = sorted(centrality, key=centrality.get, reverse=True)[:20] # 提取核心节点诱导子图:仅保留核心节点、以及核心节点之间的连边,自动过滤所有非核心内容 core_subgraph = full_graph.subgraph(top20_core_nodes) # 基于核心子图计算布局,固定随机种子保证布局可复现 pos = nx.spring_layout(core_subgraph, seed=42) # 按中心度值映射节点大小,数值越大节点尺寸越大 node_sizes = [centrality[node] * 3000 for node in core_subgraph.nodes()] # 绘制网络图 plt.figure(figsize=(10, 8)) nx.draw_networkx( core_subgraph, pos=pos, node_size=node_sizes, node_color="#3b82f6", edge_color="#d1d5db", with_labels=True, font_size=9 ) plt.axis("off") plt.show()
自定义调整说明
- 更换中心度指标只需替换中心度计算行代码即可:
- 度中心度:
centrality = nx.degree_centrality(full_graph) - 介数中心度:
centrality = nx.betweenness_centrality(full_graph) - 接近中心度:
centrality = nx.closeness_centrality(full_graph)
- 度中心度:
- 如果需要保留核心节点指向非核心节点的边、但不显示非核心节点,无需提取诱导子图,手动筛选符合条件的边列表后,在绘图时传入
edgelist=筛选后的边列表、nodelist=top20_core_nodes即可 - 调整节点大小的乘数值、画布尺寸、配色参数,可以匹配不同的可视化展示需求
内容的提问来源于stack exchange,提问作者Samsudeen Bankole
相关产品推荐
相关产品推荐

