Я создаю небольшую панель инструментов, в которой я хотел бы дать пользователю возможность выбрать, что будет отображаться на вертикальной оси из поля Select
.По сути, учитывая ColumnDataSource
и изменение значения в поле Select
, просто измените столбец, на который ссылается данная ось графика, и обновите график.Учитывая , что многие другие свойства глифов могут быть js_linked
для виджетов , я подумал, что это возможно.Пока что единственные реализации этого, которые я видел, были на серверах Bokeh, использующих обратные вызовы Python, но я стараюсь избегать использования сервера Bokeh.Следующее иллюстрирует идею:
from bokeh.models import ColumnDataSource, Select, CustomJS
from bokeh.plotting import figure
from bokeh.layouts import column
from bokeh.io import output_notebook, output_file, show
output_file('foo.html')
source = ColumnDataSource(
{
'x': [0, 1, 2, 3],
'y': [0, 1, 4, 9],
'z': [0, 2, 3, 1],
}
)
fig = figure()
line = fig.line(x='x', y='y', source=source)
dropdown = Select(value='y', options=['y','z'])
dropdown.js_link('value', line.glyph, 'y')
layout = column(dropdown, fig)
show(layout)
Я также попробовал следующее, которое, на мой взгляд, функционально идентично, но я предполагаю более явное:
from bokeh.models import ColumnDataSource, Select, CustomJS
from bokeh.plotting import figure
from bokeh.layouts import column
from bokeh.io import output_file, show
output_file('foo.html')
source = ColumnDataSource(
{
'x': [0, 1, 2, 3],
'y': [0, 1, 4, 9],
'z': [0, 2, 3, 1],
}
)
fig = figure()
line = fig.line(x='x', y='y', source=source)
dropdown = Select(value='y', options=['y','z'])
dropdown.js_on_change(
'value',
CustomJS(
args={
'glyph': line.glyph,
'source': source,
},
code="""
var new_vert = cb_obj.value;
glyph.y = new_vert;
"""))
layout = column(dropdown, fig)
show(layout)
В обоих случаях HTML будет отображаться вбраузер без ошибок, но как только значение Select
изменится, линейный график просто исчезнет, вместо того, чтобы отобразить выбранную серию CDS
.Я попытался проверить в браузере, но ошибки JS не возвращаются.Я что-то упустил, или это просто невозможно без сервера Bokeh?
РЕДАКТИРОВАТЬ:
Я должен также добавить, что я пытаюсь избежать создания второго CDS
и копирование данных в CustomJS
, так как у меня есть несколько вспомогательных участков, совместно использующих один CDS
, и я бы предпочел не создавать новые для каждого графика, чтобы их поведение оставалось связанным.