使用Bokeh根据Networkx节点属性对节点进行颜色编码

4
我正在尝试使用bokeh创建交互式网络可视化。我知道如何向bokeh图表添加属性数据,但不确定如何根据节点属性分配填充颜色。
我一直在关注所有我能找到的bokeh示例,但似乎无法弄清楚。
如何调整下面的代码以按其NetworkX节点属性着色节点?
import networkx as nx
from bokeh.io import show, output_notebook
from bokeh.plotting import figure
from bokeh.models import Circle, HoverTool, TapTool, BoxSelectTool
from bokeh.models.graphs import from_networkx

output_notebook()

# create a sample graph
G = nx.karate_club_graph()

# create the plot
plot = figure(x_range=(-1.1, 1.1), y_range=(-1.1, 1.1))

# add tools to the plot
plot.add_tools(HoverTool(tooltips=[("Name", "@name"), 
                                   ("Club", "@club")]), 
               TapTool(), 
               BoxSelectTool())

# create bokeh graph
graph = from_networkx(G, nx.spring_layout, iterations=1000, scale=1, center=(0,0))

# add name to node data
graph.node_renderer.data_source.data['name'] = list(G.nodes())

# add club to node data
graph.node_renderer.data_source.data['club'] = [i[1]['club'] for i in G.nodes(data=True)]

# set node size
graph.node_renderer.glyph = Circle(size=10)

plot.renderers.append(graph)
show(plot)

Bokeh Graph

1个回答

6
这个问题有点模糊,所以我不确定下面的代码是否完全符合您的要求。(“node”属性是您复制到“names”列中的内容吗?我认为是...)但无论如何,您可以使用linear_cmap按任何CDS列对fill_color进行颜色映射:
from bokeh.transform import linear_cmap
graph.node_renderer.glyph = Circle(
    size=10, 
    fill_color=linear_cmap('name', 'Spectral8', min(G.nodes()), max(G.nodes()))
)

如果该列是字符串因子,您也可以使用factor_cmap

输入图像描述


我的原始问题的目标是按照分类节点属性“club”而不是节点名称来着色图形。 - CurtLH
2
那么现在你需要手动将属性数据复制到CDS中的一列,然后使用上面的答案。有一个开放的Pull Request,可以自动将节点和边缘属性添加到数据源中,这将在下一个版本中发布。 - bigreddot
太棒了!感谢您的跟进! - CurtLH
@CurtLH:您应该考虑给这个答案点赞或接受它。 - Richard
@bigreddot 最新版本的bokeh现在是否支持这个功能? - edc505
以前是不可能的。如果您询问属性现在是否自动复制到CDS中,则是的,自从很多版本以前就实现了。 - bigreddot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接