我想要一个链接到Bokeh中的图表的光标。因此,如果我将光标移动到一个绘图上,则会在相邻的绘图上显示等效的线条。我还没有弄清楚如何使用内置的光标工具。所以我目前的解决方案是在每个共享源的图上划一条线。然后,当我将鼠标悬停在任一绘图上时,源会更新。
这个方法有2个问题: 这似乎是一种解决方法 2.目前这些线是有限长度的。我希望这条线是无限的,所以不管图形如何调整大小,线都会从边缘运行。目前我绘制的线是有限的。绘制无限水平线的正确方法是Span注释,但我很难确定如何通过回调传递/更新Span位置。请参阅下面的代码。
<?php
答案 0 :(得分:2)
感谢@bigreddot对跨度的回答。我曾经尝试过而没有上班,但他的提示却弄清楚了。工作代码如下。我在每个图中实现了一个跨度,然后编辑每个图的位置。
from bokeh.io import gridplot, show, output_notebook, output_file
from bokeh.plotting import figure
from bokeh.models import HoverTool, ColumnDataSource, CustomJS, Span
output_file('Test.html')
#output_notebook()
x = list(range(11))
y1 = x
y2 = [10 - i for i in x]
# create a new plot
s1 = figure(width=250, plot_height=250, tools="", title=None)
cr1 = s1.circle(x, y1, size=10, color="navy", alpha=0.5)
sp1 = Span(location=source.data['y0'][0], dimension='width', line_color='green', render_mode='css')
s1.renderers.extend([sp1,])
# create another one
s2 = figure(width=250, height=250, title=None)
cr2 = s2.triangle(x, y1, size=10, color="firebrick", alpha=0.5)
sp2 = Span(location=source.data['y0'][0], dimension='width', line_color='green', render_mode='css')
s2.renderers.extend([sp2,])
# put all the plots in an HBox
p = gridplot([[s1,s2],[]])
code = """
var cdata = circle.get('data');
var indices = cb_data.index['1d'].indices;
var sum = 0;
for (i=0; i < indices.length; i++) {
sum += cdata.y[indices[i]];
}
var avg = sum/indices.length
span1.set('location', [avg])
span2.set('location', [avg])
"""
callback1 = CustomJS(args={'circle': cr1.data_source, 'span1': sp1, 'span2': sp2}, code=code)
s1.add_tools(HoverTool(tooltips=None, callback=callback1, renderers=[cr1]))
callback2 = CustomJS(args={'circle': cr2.data_source, 'span1': sp1, 'span2': sp2}, code=code)
s2.add_tools(HoverTool(tooltips=None, callback=callback2, renderers=[cr2]))
# show the results
show(p)