Боке, можно только один раз обновить столбец с помощью обратного вызова
Используя некоторый код, который я нашел по этому вопросу, мне удалось обновить столбцы для графика, который я делаю. Проблема в том, что мне разрешено только ОДИН апдейт, а потом уже нет эффекта. Та же проблема возникает при выполнении кода из справочного вопроса. Я опубликую фрагмент здесь просто для удобства:
import bokeh
import bokeh.plotting
p = bokeh.plotting.figure(x_range=(0,4), y_range=(0,4), plot_height=200 )
csource = bokeh.models.ColumnDataSource(data=dict(
x=[1,2,3],
y=[1,2,1],
colors1=["#ff0000","#00ff00","#0000ff"],
colors2=["#ff00ff","#ffff00","#00ffff"]))
cir = p.circle(x="x",y="y",fill_color="colors1",line_color="colors1",
size=20,source=csource)
cb_cselect = bokeh.models.CustomJS(args=dict(cir=cir,csource=csource), code ="""
var selected_color = cb_obj.value;
cir.glyph.line_color.field = selected_color;
cir.glyph.fill_color.field = selected_color;
csource.trigger("change")
""")
color_select = bokeh.models.Select(title="Select colors", value="colors1",
options = ["colors1","colors2"], callback = cb_cselect)
layout = bokeh.layouts.gridplot([[p],[color_select]])
bokeh.io.output_file("output.html")
bokeh.io.show(layout)
По сути, я запускаю код, HTML-файл открывается в моем браузере, я обновляюсь через выпадающий список, затем нажимаю Сброс, прежде чем какие-либо изменения вступят в силу. После этого никакие изменения невозможны, пока я не обновлю свой браузер. Не похоже, чтобы другие пользователи имели эту проблему, поэтому я совершенно не понимаю, почему это происходит. Кроме того, я прошу прощения, я бы просто прокомментировал этот вопрос, но у меня пока нет необходимой репутации.
1 ответ
Синтаксис для оповещения о событиях в BokehJS изменился некоторое время назад. Кроме того, это глиф, который вы меняете, так что вы должны излучать change
сигнал. Вот версия обратного вызова, которая работает:
cb_cselect = bokeh.models.CustomJS(args=dict(cir=cir,csource=csource), code ="""
var selected_color = cb_obj.value;
cir.glyph.line_color.field = selected_color;
cir.glyph.fill_color.field = selected_color;
cir.glyph.change.emit()
""")