В сетевом графе bokeh, как мне навести курсор на край, чтобы выделить его, и одновременно иметь возможность отображать hoverinfo при наведении курсора на узлы? - PullRequest
0 голосов
/ 20 мая 2019

Когда я даю graph_renderer.inspection_policy = NodesAndLinkedEdges(), я теряю способность парить над краем, чтобы выделить его.Чтобы иметь эту функциональность, мне нужно установить graph_renderer.inspection_policy = EdgesAndLinkedNodes();но если я это сделаю, я потеряю информацию, которая появляется при наведении курсора на узлы - они отображаются как "???".Как это исправить?

import networkx as nx

from bokeh.io import show, output_file
from bokeh.models import Plot, Range1d, MultiLine, Circle, HoverTool, TapTool, BoxSelectTool, WheelZoomTool
from bokeh.models.graphs import from_networkx, NodesAndLinkedEdges, EdgesAndLinkedNodes
from bokeh.palettes import Spectral4

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))
plot.title.text = "Graph Interaction Demonstration"

plot.add_tools(HoverTool(tooltips=None), TapTool(), BoxSelectTool())

graph_renderer = from_networkx(G, nx.circular_layout, scale=1, center=(0,0))

graph_renderer.node_renderer.glyph = Circle(size=15, fill_color=Spectral4[0])
graph_renderer.node_renderer.selection_glyph = Circle(size=15, fill_color=Spectral4[2])
graph_renderer.node_renderer.hover_glyph = Circle(size=15, fill_color=Spectral4[1])

graph_renderer.edge_renderer.glyph = MultiLine(line_color="#CCCCCC", line_alpha=0.8, line_width=5)
graph_renderer.edge_renderer.selection_glyph = MultiLine(line_color=Spectral4[2], line_width=5)
graph_renderer.edge_renderer.hover_glyph = MultiLine(line_color=Spectral4[1], line_width=5)

graph_renderer.selection_policy = NodesAndLinkedEdges()
graph_renderer.inspection_policy = EdgesAndLinkedNodes()

hover = HoverTool(tooltips=[("Name:", "@name")])
plot.add_tools(hover, TapTool(), BoxSelectTool(), WheelZoomTool())

 '''
 Below is the relevant line of code. 
 I can't have hoverinfo if I don't set "graph_renderer.inspection_policy = NodesAndLinkedEdges()"
 But if I do, I cannot highlight an edge by hovering over it.
 To be able to highlight an edge by hovering over it, I need to set "graph_renderer.inspection_policy = EdgesAndLinkedNodes()"
 But if I do that, I get "???" when hovering over the nodes.
 How can I keep both?
 '''
graph_renderer.inspection_policy = NodesAndLinkedEdges()
graph_renderer.node_renderer.data_source.data['name'] = list(G.nodes)

plot.renderers.append(graph_renderer)

output_file("interactive_graphs.html")
show(plot)

Этот показывает 4 различных способа использования hovertool -

  1. График с помощью инструмента наведения, который выделяет края, соединенные сточка
  2. График, который подсвечивает ребра выбранного узла (по щелчку)
  3. График, который подсвечивает узлы, примыкающие к краю, где находится курсор,
  4. График, который подсвечивает соседние узлык выбранным ребрам (щелкнул)

Итак, нельзя ли одновременно навести курсор для выделения края и навести курсор для отображения информации об узле вместе?

...