在Bokeh中,CustomJS代码可以使用来自Hovertool的数据吗?

时间:2018-04-17 23:28:33

标签: python charts bokeh

我要做的是以下内容:给定一些(x,y)坐标,绘制图形。单击/悬停该图上的点时,查找其他一组坐标,(i,j)(这些坐标将被索引/(x,y)坐标的函数),并绘制这些坐标(i) ,j)在第一张图旁边的第二张图上。

我能够使用Bokeh完成我提到的所有事情,除了使用CustomJS时,我使用Tap事件,它不提供实际点的坐标,而是给出近似值到实际点,因为它只是看着鼠标坐标。我没有看到任何符合此目的的事件。我看到Hovertool实际上能够指出具体点。我可以使用那个Hoverdata吗?我无法弄清楚如何将两者合并,或者是否有其他方式。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用HoverTool.callback,这是一个示例:

import numpy as np
from bokeh.io import show
from bokeh.models import ColumnDataSource, HoverTool, CustomJS
from bokeh.plotting import figure
from bokeh.layouts import column

source1 = ColumnDataSource(data={"freq":np.random.uniform(2, 10, 10), "amp":np.random.uniform(-2, 2, 10)})
source2 = ColumnDataSource(data={"x":np.linspace(-5, 5, 200), "y":np.zeros(200)})

fig1 = figure(plot_height=200)
fig2 = figure(plot_height=200)
circle = fig1.circle("freq", "amp", source=source1, size=10)
line = fig2.line("x", "y", source=source2)

def callback(source1=source1, source2=source2):
    indices = cb_data.index["1d"].indices
    if len(indices) > 0:
        i = indices[0]
        f = source1.data.freq[i]
        a = source1.data.amp[i]
        for j in range(len(source2.data.x)):
            source2.data.y[j] = a * Math.sin(f * source2.data.x[j])
        source2.change.emit()

hover = HoverTool(callback=CustomJS.from_py_func(callback))
fig1.add_tools(hover)

show(column(fig1, fig2))