如何通过选择窗口小部件更改图像图?

时间:2019-06-16 19:28:06

标签: bokeh python-3.7

我想使用一个选择小部件/滑块小部件来更改图像图。有没有办法做到这一点?如果“不”,我有什么选择可以解决该问题?

这是我所做的简短示例:

#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数组?

致谢

1 个答案:

答案 0 :(得分:0)

您是否正在将其作为Bokeh服务器应用程序运行,即使用bokeh serve?真正的python回调仅在Bokeh服务器应用程序的上下文中起作用(Bokeh服务器正是运行Python回调代码的Python进程)。否则,如果这是独立的内容(即带有output_fileshow的内容),则仅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]]