我想使用一个选择小部件/滑块小部件来更改图像图。有没有办法做到这一点?如果“不”,我有什么选择可以解决该问题?
这是我所做的简短示例:
#Let's make some data:
image_a = np.random.randint(0,10,10000).reshape(100,100)
image_b = np.random.randint(0,10,10000).reshape(100,100)
image_c = np.random.randint(0,10,10000).reshape(100,100)
# define a callback:
def callback(attr, old, new):
plot.image = [select_widget.value]
#create a figure:
plot = figure()
# And plot the image "image_a"
plot.image(image=[image_a])
# create a select-widget with options:
select_widget = Select(title="Title", \
value="image_a", \
options=["image_a","image_b","image_c"])
# If the widget will be changed call a callback-function to modify
# the image by selection:
select_widget.on_change('value', callback)
layout = row(select_widget, plot)
curdoc().add_root(layout)
不幸的是,图像将不会按预期更新。 Lateron我想使用滑块加载不同的图像。但是我不确定是否可以做到这一点。
也许还有另一种方法来绘制一个numpy数组?
致谢
答案 0 :(得分:0)
您是否正在将其作为Bokeh服务器应用程序运行,即使用bokeh serve
?真正的python回调仅在Bokeh服务器应用程序的上下文中起作用(Bokeh服务器正是运行Python回调代码的Python进程)。否则,如果这是独立的内容(即带有output_file
和show
的内容),则仅JavaScript CustomJS
回调是可能的。
在《用户指南》一章中,有许多使用CustomJS
回调来更新绘图的示例:JavaScript Callbacks
在GitHub存储库的examples/app
文件夹中的Bokeh服务器应用程序中有许多真实的Python回调示例。您还应该考虑研究《用户指南》的Running a Bokeh Server一章。正是为了提供这种背景而编写的。
在任何情况下,上面的代码在任何情况下都不会起作用。 select小部件的 value 是一个 string ,即“ image_a”,因此您的回调函数等效于:
plot.image = ["image_a"]
这显然是荒谬的。您需要列表的内容是一个实际的数组。假设这是一个Bokeh服务器应用程序(以便真正的Python回调可以工作),则可以使用dict将字符串映射到实际数组:
data = {
"image_a": image_a,
"image_b": image_b,
"image_c": image_c,
}
然后:
plot.image = [data[select_widget.value]]