如何让一个 slider/widget 更新 Bokeh/Python/Pywidgets 中的多个地块?
How to make one slider/widget update multiple plots in Bokeh/Python/Pywidgets?
使用Jupyter notebook,如何让一个滑块交互更新两个图形中的两个独立函数?
有一个类似问题 link 没有答案 here。
使用 Bokeh Javascript Callback slider power example,我尝试添加第二组变量 x 和 y,但继续使用相同的回调。图表不再更新。
有什么建议么?我也试图用 Pywidget 做同样的事情,但没有取得任何进展。如果那里有解决方案,我更愿意使用 IPywidget。
最终目标是拥有一个仪表板,其输入由多个滑块组成,输出由多个图组成,所有这些都依赖于同一组滑块输入。
from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.plotting import Figure, output_notebook, show
output_notebook()
x = [x*0.005 for x in range(0, 200)]
y = x
x1 = [x1*0.005 for x1 in range(0, 200)]
y1 = x1
source = ColumnDataSource(data=dict(x=x, y=y))
source1 = ColumnDataSource(data=dict(x1=x1,y1=y1))
plot = Figure(plot_width=400, plot_height=400)
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)
plot1 = Figure(plot_width=400, plot_height=400)
plot1.line('x1', 'y1', source=source1, line_width=3, line_alpha=0.6)
callback = CustomJS(args=dict(source=source, source1=source1), code="""
var data = source.data;
var data1 = source1.data;
var f1 =cb_obj.value
var f = cb_obj.value
x = data['x']
y = data['y']
x1 = data['x1']
y1 = data['y1']
for (i = 0; i < x.length; i++) {
y[i] = Math.pow(x[i], f)
}
for (i = 0; i < x1.length; i++) {
y1[i] = Math.pow(x1[i], f1)
}
source.change.emit();
source1.change.emit();
""")
slider = Slider(start=0.1, end=4, value=1, step=.1, title="power")
slider.js_on_change('value', callback)
layout = column(slider, plot,plot1)
show(layout)
下面显示了带有滑块的两个图形的快照。 Slider 没有更新任何图表。
Slider and two plots.
您只需要稍微修复一下:
替换
x1 = data['x1']
y1 = data['y1']
和
x1 = data1['x1']
y1 = data1['y1']
除此之外,您的示例效果很好,谢谢!我希望其他人会发现它有用。
使用Jupyter notebook,如何让一个滑块交互更新两个图形中的两个独立函数? 有一个类似问题 link 没有答案 here。
使用 Bokeh Javascript Callback slider power example,我尝试添加第二组变量 x 和 y,但继续使用相同的回调。图表不再更新。 有什么建议么?我也试图用 Pywidget 做同样的事情,但没有取得任何进展。如果那里有解决方案,我更愿意使用 IPywidget。 最终目标是拥有一个仪表板,其输入由多个滑块组成,输出由多个图组成,所有这些都依赖于同一组滑块输入。
from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.plotting import Figure, output_notebook, show
output_notebook()
x = [x*0.005 for x in range(0, 200)]
y = x
x1 = [x1*0.005 for x1 in range(0, 200)]
y1 = x1
source = ColumnDataSource(data=dict(x=x, y=y))
source1 = ColumnDataSource(data=dict(x1=x1,y1=y1))
plot = Figure(plot_width=400, plot_height=400)
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)
plot1 = Figure(plot_width=400, plot_height=400)
plot1.line('x1', 'y1', source=source1, line_width=3, line_alpha=0.6)
callback = CustomJS(args=dict(source=source, source1=source1), code="""
var data = source.data;
var data1 = source1.data;
var f1 =cb_obj.value
var f = cb_obj.value
x = data['x']
y = data['y']
x1 = data['x1']
y1 = data['y1']
for (i = 0; i < x.length; i++) {
y[i] = Math.pow(x[i], f)
}
for (i = 0; i < x1.length; i++) {
y1[i] = Math.pow(x1[i], f1)
}
source.change.emit();
source1.change.emit();
""")
slider = Slider(start=0.1, end=4, value=1, step=.1, title="power")
slider.js_on_change('value', callback)
layout = column(slider, plot,plot1)
show(layout)
下面显示了带有滑块的两个图形的快照。 Slider 没有更新任何图表。 Slider and two plots.
您只需要稍微修复一下:
替换
x1 = data['x1']
y1 = data['y1']
和
x1 = data1['x1']
y1 = data1['y1']
除此之外,您的示例效果很好,谢谢!我希望其他人会发现它有用。