Как передать объект, на который нажата кнопка в сетевом графике боке

#python #networkx #bokeh

Вопрос:

Я реализовал сетевой график боке с источником данных следующим образом:

 # Create a Bokeh graph from the NetworkX input using nx.spring_layout
graph = from_networkx(G, nx.spring_layout, center=(0,0), scale=1.8)
plot.renderers.append(graph)

# Add some new columns to the node renderer data source
#graph.node_renderer.data_source.data['index'] = list(range(len(G)))
degrees = scale_degree_size([v[1] for v in G.degree()], 5, 20)
graph.node_renderer.data_source.data['degree'] = degrees
graph.node_renderer.data_source.data["color"] = [colors[G.nodes[x].get("isA")] if G.nodes[x].get("isA") else colors["default"]for x in nx.nodes(G)]
graph.node_renderer.data_source.data["type"] = [G.nodes[x].get("isA").split('/')[-1] if G.nodes[x].get("isA") else "Untyped" for x in nx.nodes(G)]
graph.node_renderer.data_source.data["aka"] = [G.nodes[x].get("aka").split('/')[-1] if G.nodes[x].get("aka") else "???" for x in nx.nodes(G)]

graph.node_renderer.glyph = Circle(size=15, fill_color="red") #Spectral4[0])
graph.node_renderer.selection_glyph = Circle(size=15, fill_color=Spectral4[2])
graph.node_renderer.hover_glyph = Circle(size=15, fill_color=Spectral4[1])


graph.edge_renderer.glyph = MultiLine(line_color="#CCCCCC", line_alpha=0.8, line_width=3) # , end=OpenHead(line_color="firebrick", line_width=4)
graph.edge_renderer.selection_glyph = MultiLine(line_color=Spectral4[2], line_width=5)
graph.edge_renderer.hover_glyph = MultiLine(line_color=Spectral4[1], line_width=5)

graph.selection_policy = NodesAndLinkedEdges()

graph.node_renderer.glyph.update(size='degree')  #, fill_color="colors")
graph.node_renderer.glyph.update(fill_color='color')
 

Это работает без каких-либо проблем. Теперь мне нужно добавить функцию отображения информационного поля при нажатии на узел в пользовательском интерфейсе. Поэтому я попытался добавить эту функцию в Tap .

 # setup button click
def callback(???):
    return CustomJS(args=dict(degrees=graph.node_renderer.data_source.data), code='alert(`${???}`)') 

plot.js_on_event('tap', callback(???))

show(plot)
 

Мой вопрос в том, как мне передать информацию о том, на какой узел был нажат, в CustomJS? Я посмотрел cb_obj , но у него есть только положение мыши, и мне нужна информация об узле, на который нажали.

Комментарии:

1. Индекс того, на какие символы были нажаты, является выбором и доступен через обратный вызов выбора: docs.bokeh.org/en/latest/docs/user_guide/interaction/…

2. используйте tap с событием Tap. и вы можете получить данные из источника.данные.индексы

Ответ №1:

добавить Кран

 plot.on_event(Tap, function)
 

и обновите свой источник индексами

 def function():
    print(source.selected.indices)
 

у меня нет ваших данных, так что не могу помочь больше.