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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:04:34