Как программно обновить выбранные исходные индексы? - PullRequest
0 голосов
/ 30 мая 2018

Из документов объект Selection говорит:

Выборки обычно создаются путем выбора точек на графике с помощью SelectTool, но также могут быть заданы программно.

Но я не умею устанавливать некоторые выбранные точки программно.Например, если я хочу обновить выбор, нажав на какую-нибудь кнопку.Я могу обновить элемент source.selected.indices, но событие не инициируется, и точки не помечаются как выбранные

from bokeh.io import curdoc
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.layouts import column
from bokeh.models.tools import LassoSelectTool, TapTool
from bokeh.models.widgets.buttons import Button

source = ColumnDataSource(dict(
    x=[1, 2, 3, 4, 5, 6],
    y=[1, 2, 3, 4, 5, 6],
))

p = figure(
    plot_height=300,
    tools='',
)
p.circle( x='x', y='y', size=20, source=source)

lasso_select = LassoSelectTool(
    select_every_mousemove=False,
)
tap = TapTool()
tools = (lasso_select, tap)
p.add_tools(*tools)

def update_selection_programmatically():
    source.selected.update(indices=[4])           # the indices attribute is updated but the figure is not repainted, some event is not triggered.
                                                  # So the points are not marked as selected
bt = Button(
    label="Update Selection",
    button_type="success",
    width=50
)

bt.on_click(update_selection_programmatically)


def update_selection(attr, old, new):
    print('>> NEW SELECTION: {}'.format(new.indices))
    # new.indices = [0]       # this works fine here

source.on_change('selected', update_selection)

curdoc().add_root(column([p, bt]))

Атрибут индексов обновляется, но рисунок не перерисовывается.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Обновление ответа

Наконец-то разработчики боке решили проблему.Теперь индексы могут быть обновлены с помощью

source.selected.update(indices=[4])

# or equivalently

source.selected.indices = [4]

Старый обходной путь

johncthomas написал комментарий в выпуске GitHub .Существует обходной путь:

Я нашел способ обойти это

# When this does not update the visible selections 
source.selected.indices = new_indicies

# This causes the selections to be visible
source.data = source.data

В частности, это при запуске сервера в версии 13.0.Очевидно, не идеально, но у меня это сработало.

0 голосов
/ 30 мая 2018

Это работает с обратным вызовом CustomJS

bt.callback = CustomJS(args={'source':source},code="""source.selected.indices = [4];source.change.emit();""")

Я думаю, что обратные вызовы Python должны выполнять source.change.emit () автоматически, поэтому не уверен, почему ваш не работает.Но вы можете сделать это явно в обратном вызове JS.

И я не знаю почему, но это не вызывает update_selection

...