python - 散景中的单独节点和边缘悬停工具?
问题描述
我正在尝试为 Bokeh 中的节点和边缘获取单独的悬停工具提示,但无法使其正常工作。有人可以指出我做错了什么吗?我相信代码应该是这样的:
from bokeh.io import show, output_notebook
from bokeh.models import Plot, Range1d, MultiLine, Circle, HoverTool
from bokeh.models.graphs import from_networkx, NodesAndLinkedEdges, EdgesAndLinkedNodes
import networkx as nx
output_notebook()
# Generate data
G = nx.karate_club_graph()
nx.set_edge_attributes(G, nx.edge_betweenness_centrality(G), "betweenness_centrality")
# Setup plot
plot = Plot(plot_width=400, plot_height=400,
x_range=Range1d(-1.1, 1.1), y_range=Range1d(-1.1, 1.1))
graph_renderer = from_networkx(G, nx.spring_layout, scale=1, center=(0, 0))
graph_renderer.node_renderer.glyph = Circle(size=15)
graph_renderer.edge_renderer.glyph = MultiLine(line_alpha=0.8, line_width=1)
plot.renderers.append(graph_renderer)
# Add hover
node_hover_tool = HoverTool(renderers=[graph_renderer.node_renderer],
tooltips=[("index", "@index"), ("club", "@club")])
edge_hover_tool = HoverTool(renderers=[graph_renderer.edge_renderer],
tooltips=[("betweenness_centrality", "@betweenness_centrality")],
line_policy="interp")
plot.add_tools(node_hover_tool, edge_hover_tool)
# Show
show(plot)
但我没有看到任何悬停在此之上。我尝试了一些方法来解决这个问题:
- 如果我删除
renderers
参数,我可以悬停一些,但不是特定于我想要的字形。 - 如果我
renderers
从两个HoverTool
s 中删除参数,我可以在节点上获得正确的工具提示以及betweenness_centrality: ??
- 如果我从s 和 add中删除
renderers
参数,我会在节点上获得正确的工具提示HoverTool
graph_renderer.inspection_policy = NodesAndLinkedEdges()
- 如果我从s 和 add中删除
renderers
参数,我会在边缘得到正确的工具提示HoverTool
graph_renderer.inspection_policy = EdgesAndLinkedNodes()
我相信这个问题之前在 google group here上被问过,但没有得到答案。
谢谢你的帮助!
解决方案
因此,我们以不同的方式构建网络,但我刚刚使用 networkx 中的一个散景渲染网络解决了这个问题。
我这样做的方式是通过使用此处另一个问题中概述的lines_source方法使用我想要的networkx数据生成数据帧,它为您提供:
....
plot = figure(
plot_width=1100, plot_height=700,
tools=['tap','box_zoom', 'reset']
) # This is the size of the widget designed.
# This function sets the color of the nodes, but how to set based on the
# name of the node?
r_circles = plot.circle(
'x', 'y', source=nodes_source, name= "Node_list",
size="_size_", fill_color="_color_", level = 'overlay',
)
hover = HoverTool(
tooltips=[('Name', '@name'),('Members','@Members')],
renderers=[r_circles]
) # Works to render only the nodes tooltips
def get_edges_specs(_network, _layout):
d = dict(xs=[], ys=[], alphas=[],from_node=[],to_node=[])
weights = [d['weight'] for u, v, d in _network.edges(data=True)]
max_weight = max(weights)
calc_alpha = lambda h: 0.1 + 0.6 * (h / max_weight)
for u, v, data in _network.edges(data=True):
d['xs'].append([_layout[u][0], _layout[v][0]])
d['from_node'].append(u)
d['to_node'].append(v)
d['ys'].append([_layout[u][1], _layout[v][1]])
d['alphas'].append(calc_alpha(data['weight']))
return d
lines_source = ColumnDataSource(get_edges_specs(network, layout))
r_lines = plot.multi_line(
'xs', 'ys',
line_width=1.5, alpha='alphas', color='navy',
source=lines_source
) # This function sets the color of the edges
然后我生成了一个悬停工具来显示我想要的边缘信息,所以在我的例子中,我想知道“来自节点”属性。我还想给它起一个崇高的名字,所以工具提示将呈现“Whered_ya_come_from”
hover2 = HoverTool(
tooltips=[('Whered_ya_come_from','@from_node')],
renderers=[r_lines]
)
然后我们如何实现它的唯一区别是你尝试将它作为一个单独的添加到情节中,而我一个接一个地绘制它们。
plot.tools.append(hover1)
# done to append the tool at the end because it has a problem getting
# rendered, as it depended on the nodes being rendered first.
plot.tools.append(hover2)
从那里,您可以将其导出或呈现为 HTML 文件(我的首选方法)。
推荐阅读
- c++ - CMake 错误:在 Mac OS 上使用 clang 找不到 OpenMP_C(缺少:OpenMP_C_FLAGS)
- python - 将变量与多个值进行比较的简洁方法
- apache-kafka - 知道为什么这个 Kafka 经纪人会崩溃吗?里面的日志。我在这里没有看到任何明显的东西
- excel - 在 Excel 工作表中显示数据时间时出错
- c++ - constexpr(sizeof(T)):为什么在 `sizeof` 上指定 `constexpr`?
- arrays - 基于元素值的 Ruby 数组到子数组
- verilog - 这两个计数器有什么区别?
- excel - 公式 VBA 中的动态范围
- mysql - 如何在没有主键的mysql表中添加主键
- salesforce - DocuSign Apex 工具包使用多个数据源创建信封