@app.route('/bokeh_network')
def bokeh_network():
import networkx as nx
# from_networkx는 networkx에서 그래프를 가져와서 바로 그려주기 위해서 사용됨.
from bokeh.models.graphs import from_networkx
# Spectral4는 색깔을 지정해주기 위해서 사용됩니다. matplotlib의 cmap과 유사하다고 생각하면 될것 같네요.
from bokeh.palettes import Spectral4
from bokeh.models import Plot, Range1d, MultiLine, Circle, HoverTool, BoxZoomTool, ResetTool
# 아래 코드는 바로 html 파일로 변경하여 보내주기 위해서 만듬
from bokeh.embed import file_html
from bokeh.resources import CDN
### nx code
"""
- Graph를 만들기는 귀찮아서, 기존에 있는 것을 그대로 가져옵니다.
- (0, {'club': 'somt string'})으로 각 노드가 정의되어 있습니다.
"""
G = nx.karate_club_graph()
"""
- edge_color를 networkx의 edge attribute로 넘겨줍니다.
- 이를 이용해서, 이후 네트워크를 렌더링할 때 edge의 색깔을 결정할 수 있습니다.
"""
SAME_CLUB_COLOR, DIFFERENT_CLUB_COLOR = "black", "red"
for n1, n2 in G.copy().edges():
if G.nodes[n1]['club']==G.nodes[n2]['club']:
G.edges[(n1, n2)]['edge_color'] = SAME_CLUB_COLOR
else:
G.edges[(n1, n2)]['edge_color'] = DIFFERENT_CLUB_COLOR
#############
### bokeh code
plot = Plot(plot_width=400, plot_height=400,
x_range=Range1d(-1.1, 1.1), y_range=Range1d(-1.1, 1.1))
plot.title.text = "Graph Interaction Demonstration"
node_hover_tool = HoverTool(tooltips=[("index", "@index"), ("club", "@club")])
plot.add_tools(node_hover_tool, BoxZoomTool(), ResetTool())
graph_renderer = from_networkx(G, nx.spring_layout, scale=1, center=(0, 0))
graph_renderer.node_renderer.glyph = Circle(size=15, fill_color=Spectral4[0])
graph_renderer.edge_renderer.glyph = MultiLine(line_color="edge_color", line_alpha=0.8, line_width=1)
plot.renderers.append(graph_renderer)
return file_html(plot, CDN)
댓글남기기