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

如何在Bokeh和Holoviews中按NetworkX节点属性为网络图着色

解决Holoviews导入NetworkX节点属性并着色的问题

我明白你的困扰——Holoviews的from_networkx方法默认不会自动把NetworkX节点的属性带进来,这就是你设置color_index='club'却没生效的原因。不用转成Pandas也能搞定,只需要手动把节点属性添加到Holoviews Graph的节点数据集中就行。

关键问题分析

当你用hv.Graph.from_networkx(g, nx.spring_layout)创建图时,Holoviews只会加载节点的位置和边的连接信息,不会自动导入节点的自定义属性。所以你需要把NetworkX里的节点属性提取出来,关联到Holoviews Graph的nodes.data数据结构中,这样color_index才能识别到对应的属性列。

修改后的完整代码

import networkx as nx
import holoviews as hv

hv.extension('bokeh')
%opts Graph [width=400 height=400]

# 创建示例图
g = nx.karate_club_graph()

# 加载NetworkX图到Holoviews
graph = hv.Graph.from_networkx(g, nx.spring_layout)

# 核心步骤:将NetworkX的节点属性添加到Holoviews Graph中
# 获取Holoviews Graph中的节点顺序(确保和NetworkX节点一一对应)
node_indices = graph.nodes.data['index'].tolist()
# 提取每个节点的'club'属性
club_attributes = [g.nodes[node]['club'] for node in node_indices]
# 将属性添加到Graph的节点数据列中
graph.nodes.data['club'] = club_attributes

# 定义颜色调色板
colors = ['#000000'] + hv.Cycle('Category20').values

# 设置绘图选项
plot_opts = dict(color_index='club', xaxis=None, yaxis=None, show_frame=False)
style_opts = dict(node_size=15, cmap=colors, edge_line_width=2, edge_alpha=0.3)

# 应用选项并设置 padding
padding = {'x': (-1.2, 1.2), 'y': (-1.2, 1.2)}
graph = graph.redim.range(**padding).opts(style=style_opts, plot=plot_opts)

# 显示图
graph

扩展:一次性添加所有节点属性

如果你以后要支持下拉菜单切换不同属性着色,可以一次性把所有节点属性都导入:

# 遍历所有节点属性,批量添加到Holoviews Graph中
for attr_name in g.nodes[0].keys():
    attr_values = [g.nodes[node][attr_name] for node in node_indices]
    graph.nodes.data[attr_name] = attr_values

这样后续只需要修改color_index的参数值,就能切换不同属性的着色效果,为实现下拉菜单交互打下基础。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:30:51