NetworkX转换为Bokeh动态可视化(D3.js)

发布时间:2021-12-03 公开文章
I am not a designer nor a coder. I'm just a guy with a point-of-view and a computer.

翻译:俺不是码畜,俺只是一条对着电脑有点想法的图狗。

经验

  • 一旦遇到问题,请过滤掉专家的意见,只采纳跟你有类似经历的人的意见。
  • 做好最坏的打算,以最积极的心态去面对,而不是逃避。
  • 学不学编程,完全取决于是否想学,其他的别多想。
  • 种一棵树最好的时间是十年前,其次是现在。

代码

NetworkX2 Bokeh

import sys
from math import sqrt
import matplotlib.pyplot as plt
import networkx as nx
import numpy as np
import bokeh
from bokeh.io import show, output_notebook, output_file
from bokeh.models import Plot, Range1d, MultiLine, Circle, StaticLayoutProvider
from bokeh.models import HoverTool, BoxZoomTool, ResetTool
from bokeh.models.graphs import from_networkx
%matplotlib inline
output_notebook()
<div class="bk-root">
    <a href="https://bokeh.pydata.org" target="_blank" class="bk-logo bk-logo-small bk-logo-notebook"></a>
    <span id="1001">Loading BokehJS ...</span>
</div>

NetworkX

# 准备数据
Dataset1 = ['A', 'B', 'C', 'D', 'E', 'F']
Dataset2 = ['ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'TWENTY_EIGHT']
Edgelist = [('A', 'ONE'), ('B', 'ONE'), ('E', 'ONE'), ('A', 'TWO'),
            ('A', 'THREE'), ('A', 'FOUR'), ('C', 'THREE'), ('D', 'FIVE'), ('D', 'TWENTY_EIGHT')]
G = nx.Graph()
G.add_nodes_from(Dataset1, color='green')
G.add_nodes_from(Dataset2, color='blue')

# 定义节点大小
G.add_nodes_from(Dataset1, size_for_networkx=400)
G.add_nodes_from(Dataset2, size_for_networkx=50)

G.add_edges_from(Edgelist, weight=0.8)

layout = nx.spring_layout(G, k= 1.1 / sqrt(G.number_of_nodes()), iterations=100)

# 使用NetworkX / matplotlib绘图(静态)
nx.draw(G,
        layout,
        node_color=[attr['color'] for node, attr in G.nodes(data=True)],
        node_size=[attr['size_for_networkx'] for node, attr in G.nodes(data=True)])

 

 

 

 

 

Bokeh

# 定义节点大小
def calc_radius(area: float):
    r = np.sqrt(area / np.pi)
    return r
size_for_bokeh = {node: calc_radius(attr['size_for_networkx']) for node, attr in G.nodes(data=True)}
nx.set_node_attributes(G, size_for_bokeh, 'size_for_bokeh')

# networkx2bokeh图层
graph_renderer = from_networkx(G, layout)
# 画布
plot = Plot(plot_width=500, plot_height=300,
            x_range=Range1d(-1.1, 1.1), y_range=Range1d(-1.1, 1.1))

# 转换节点属性
graph_renderer.node_renderer.glyph = Circle(size='size_for_bokeh', fill_color='color')
graph_renderer.edge_renderer.glyph = MultiLine(line_alpha=0.8, line_width=1)
# 工具条
hover = HoverTool(tooltips=[('name', '@index')])
plot.add_tools(hover, BoxZoomTool(), ResetTool())
# 绘图
plot.renderers.append(graph_renderer)
# 显示
show(plot)

 

 

 

 

 

【注】Bokeh基于D3.js,通过其工具条可以实现更复杂的交互。