如何在Python的NetworkX中基于类别为网络图节点着色?
如何在Python的NetworkX中基于类别为网络图节点着色?
我来帮你搞定节点按类别着色的问题!其实核心思路就是先给每个节点绑定对应的类别属性,再建立类别和颜色的映射,最后把颜色列表传给绘图函数就行。下面一步步来:
第一步:准备数据与基础图结构
先把基础代码完善,确保能拿到节点的类别信息:
import pandas as pd import networkx as nx import matplotlib.pyplot as plt # 读取边数据 links_data = pd.read_csv("https://raw.githubusercontent.com/johnsnow09/network_graph/refs/heads/main/links_filtered.csv") # 创建基础图结构 G = nx.from_pandas_edgelist(links_data, 'var1', 'var2')
第二步:为节点绑定类别属性
你的边数据里包含了每个变量(节点)的类别,但同一个节点可能在var1或var2列重复出现,所以需要先整理出每个唯一节点对应的类别:
# 合并var1和var2的节点与类别,去重得到唯一节点-类别对应关系 nodes_category_df = pd.concat([ links_data[['var1', 'Category']].rename(columns={'var1': 'node'}), links_data[['var2', 'Category']].rename(columns={'var2': 'node'}) ]).drop_duplicates(subset='node') # 转为字典格式,方便给节点添加属性 node_category_map = nodes_category_df.set_index('node')['Category'].to_dict() # 给图中的每个节点绑定类别属性 nx.set_node_attributes(G, node_category_map, 'category')
第三步:建立类别-颜色映射
你可以根据自己的类别数量和喜好自定义颜色,这里给你举个示例:
# 定义类别到颜色的映射(可替换成你喜欢的颜色代码) category_color = { 'Demographics': '#1f77b4', # 蓝色 'Anthropometry': '#ff7f0e', # 橙色 'Biochemical': '#2ca02c', # 绿色 'Lifestyle': '#d62728' # 红色 }
第四步:生成节点颜色列表并绘图
现在把每个节点对应的颜色提取出来,传给nx.draw的node_color参数即可:
plt.figure(figsize=(10, 8)) # 调整图的大小,让标签更清晰 # 为每个节点匹配对应的颜色 node_colors = [category_color[G.nodes[node]['category']] for node in G.nodes()] # 绘制网络图 nx.draw(G, with_labels=True, node_color=node_colors, node_size=300, edge_color='gray', linewidths=.5, font_size=8) plt.show()
额外方案:用PyVis做交互式网络图
如果你想要更直观的交互式效果,可以试试PyVis库,它支持鼠标缩放、拖拽节点,按类别着色也很简单:
from pyvis.network import Network # 初始化交互式网络 net = Network(height="750px", width="100%", bgcolor="#222222", font_color="white") # 添加节点并设置对应颜色 for node, category in node_category_map.items(): net.add_node(node, color=category_color[category], size=20) # 添加边 for _, row in links_data.iterrows(): net.add_edge(row['var1'], row['var2']) # 生成交互式HTML文件(打开即可查看) net.show("category_network.html")
这样就能轻松实现按类别给节点着色啦,你可以根据自己的需求调整颜色、节点大小这些参数~
备注:内容来源于stack exchange,提问作者ViSa
相关产品推荐
相关产品推荐

