我有一个函数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相空间。
答案 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
或其他解决方法的更好的解决方案吗?