在散景中通过鼠标从图中提取值

时间:2017-07-03 22:23:26

标签: bokeh interactive

我有一个函数y = f(x,a,b),其中x,y是独立变量和因变量,a,b是参数。

我想生成一个双面板图[A,B],其中A是a-versus-b参数空间,B是y-versus-x函数行。我希望能够在面板A中使用鼠标(例如,通过悬停)来选择一对(a,b)值,然后相应地更新面板B中的y - x线。

我需要用什么小部件/方法来实现这个目标?我对bokeh hover tool进行了一些研究,但它生成了工具提示而不是面板图,另外我不知道如何从鼠标中提取除鼠标工具提示语法之外的值。

PS:我知道这可以通过使用两个滑块(一个用于a,一个用于b)来实现,但使用面板和鼠标可以更灵活地探测a-b相空间。

2 个答案:

答案 0 :(得分:1)

我认为我找到了解决您问题的方法。

我给您完整的代码:

true

如果您想改善它,请给我反馈。

良好的编码

答案 1 :(得分:0)

部分解决方案

我发现了一个非常类似的问题with the answer,关于如何从鼠标悬停工具中提取值。结合另一个example关于从不同小部件/子图中的回调更改子图,这里有一个工作解决方案,其中有一些主要缺点,如下所示:

# my test
from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource, HoverTool
from bokeh.plotting import Figure, output_notebook, show

output_notebook()

x0 = [x*0.005 for x in range(0, 200)]
y0 = x0
sB = ColumnDataSource(data=dict(x=x0, y=y0))
sA = ColumnDataSource(data = dict(x=[0],y=[0]))

callback = CustomJS(args=dict(sA=sA,sB=sB), code="""
    var geometry = cb_data['geometry'];
    var a = geometry.x; // current mouse x position in plot coordinates
    var b = geometry.y; // current mouse y position in plot coordinates
    var as = sA.get('data')['x'];
    var bs = sA.get('data')['y'];
    as[0] = a;
    bs[0] = b;
    sA.trigger('change');

    var data = sB.data;
    x = data['x']
    y = data['y']
    for (i = 0; i < x.length; i++) {
        y[i] = Math.pow(x[i], a+b) // have to convert python function to js here!!!
    }
    sB.trigger('change');
""")

hover_tool = HoverTool(callback=callback)
A = Figure(x_range=(0,1), y_range=(0,1), tools= [hover_tool,
                        "crosshair,box_zoom,wheel_zoom,pan,reset"])
A.circle(x='x',y='y',source=sA)
B = Figure(x_range=(0,1), y_range=(0,1), tools= ["crosshair,box_zoom,wheel_zoom,pan,reset"])
B.line(x='x',y='y',source=sB)
layout = column(A,B)
show(layout)

这个解决方案的一个主要缺点是它利用了我完全不熟悉的javascript,并且我必须将函数f(x,a,b)从python转换为javascript。我会感谢任何可以保留原始python函数f或其他解决方法的更好的解决方案吗?