如何在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
相关产品推荐
相关产品推荐

