Используя следующий код с сервером Bokeh, в настоящее время я могу раскрасить выбранный узел в сетевом графике в розовый цвет, выбрав его из выпадающего списка.
Что я хотел бы сделать, так это расширить код доdo is позволяет мне выполнять тот же самый обратный вызов выделения при щелчке узла , используя Taptool()
или каким-либо другим методом. Возможно ли это?
import networkx as nx
from bokeh.models.graphs import from_networkx
from bokeh.models import Range1d, MultiLine, Circle, TapTool, Plot
from bokeh.plotting import figure
from bokeh.io import curdoc
from bokeh.layouts import row
from bokeh.models.widgets import Dropdown
def choose_node_outline_colors(node_clicked):
outline_colors = []
for node in G.nodes():
if str(node) == node_clicked:
outline_colors.append('pink')
else:
outline_colors.append('black')
return outline_colors
def update_node_highlight(attrname, old, new):
node_clicked = dropdown.value
data['line_color'] = choose_node_outline_colors(node_clicked)
G = nx.karate_club_graph()
plot = Plot(plot_width=400, plot_height=400,
x_range=Range1d(-1.1,1.1), y_range=Range1d(-1.1,1.1))
graph = from_networkx(
G,
nx.circular_layout,
scale=1,
center=(0,0)
)
# Create nodes and edges
data = graph.node_renderer.data_source.data
data['line_color'] = choose_node_outline_colors('1')
graph.node_renderer.glyph = Circle(size=10, line_color="line_color")
graph.edge_renderer.glyph = MultiLine(line_alpha=1.6, line_width=0.5)
# Add tap tool
plot.add_tools(TapTool())
plot.renderers.append(graph)
# Dropdown menu to highlight a particular node
dropdown = Dropdown(label="Highlight Node", menu=list(map(str, list(G.nodes()))))
dropdown.on_change('value', update_node_highlight)
dropdown.value = '1'
curdoc().add_root(row(plot, dropdown))