Обновить ссылку на столбец ColumnDataSource на статической странице - PullRequest
0 голосов
/ 25 сентября 2019

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

1 Ответ

0 голосов
/ 26 сентября 2019

Значение y на самом деле является объектом, который указывает, должно ли значение быть единственным фиксированным значением, последовательностью значений из CDS.Python API в значительной степени скрывает все это.Короче говоря, вам нужно будет использовать вторую версию и изменить назначение на

glyph.y = {field: new_vert};
...