Как я могу изменить графическое изображение, выбрав виджет? - PullRequest
0 голосов
/ 16 июня 2019

Я хочу использовать select-widget / slider-widget для изменения графического изображения. Есть способ сделать это? И если «нет», каковы мои варианты реализации этой проблемы?

Вот краткий пример того, что я сделал:

#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)

К сожалению, изображение не будет обновлено должным образом. Позже я хочу использовать слайдер для загрузки разных изображений. Но я не уверен, смогу ли я это сделать.

Может быть, есть другой способ построения массива numpy?

1010 * привет *

1 Ответ

0 голосов
/ 17 июня 2019

Запускаете ли вы это как серверное приложение Bokeh, т.е. с bokeh serve? Реальные обратные вызовы Python работают только в контексте серверного приложения Bokeh (сервер Bokeh - это именно тот процесс Python, который выполняет код обратного вызова Python). В противном случае, если это автономный контент (то есть с output_file и show), тогда возможны только обратные вызовы JavaScript CustomJS.

Существует множество примеров использования CustomJS обратных вызовов, которые обновляют графики в главе Руководства пользователя: JavaScript Callbacks

Существует множество примеров реальных обратных вызовов Python, используемых в серверных приложениях Bokeh, в папке examples/app репозитория GitHub. Вам также следует изучить главу Запуск сервера Bokeh в Руководстве пользователя. Это было написано, чтобы обеспечить именно такой вид фона.

В любом случае приведенный выше код не будет работать ни в одном случае. значение выбранного виджета представляет собой строку , то есть "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]]
...