Боке: Как редактировать df или CDS-объект через box_select? - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь пометить pandas-df (содержащий данные временных рядов) с помощью bokeh-lineplot, box_select tool и виджета TextInput в jupyter-notebook.Как получить доступ к выбранным точкам данных с помощью box_select?

Я попытался отредактировать похожий код проблемы ( Получить выбранные данные, содержащиеся в инструменте выбора ящика в Bokeh ), изменив CustomJS на что-тонапример:

source.callback = CustomJS(args=dict(p=p), code="""
        var inds = cb_obj.get('selected')['1d'].indices;
        [source.data['xvals'][i] for i in inds] = 'b'
        """
)

, но не может применить изменение к источнику выбранных точек.

Таким образом, краткосрочная цель состоит в том, чтобы манипулировать определенным столбцом источника выбранных точек.

В долгосрочной перспективе я хочу использовать виджет TextInput для маркировки выбранных точек с помощью предоставленного Textinput.Это будет выглядеть так:

enter image description here

РЕДАКТИРОВАТЬ:

Это текущий код, который я пытаюсь втетрадь, для восстановления вопроса:

from random import random

import bokeh as bk
from bokeh.layouts import row
from bokeh.models import CustomJS, ColumnDataSource, HoverTool
from bokeh.plotting import figure, output_file, show, output_notebook

output_notebook()

x = [random() for x in range(20)]
y = [random() for y in range(20)]

hovertool=HoverTool(tooltips=[("Index", "$index"), ("Label", "@label")])

source = ColumnDataSource(data=dict(x=x, y=y, label=[i for i in "a"*20]))
p1 = figure(plot_width=400, plot_height=400, tools="box_select", title="Select Here")
p1.circle('x', 'y', source=source, alpha=0.6)
p1.add_tools(hovertool)
source.selected.js_on_change('indices', CustomJS(args=dict(source=source), code="""
        var inds = cb_obj.indices;
        for (var i = 0; i < inds.length; i++) {
            source.data['label'][inds[i]] = 'b'
        }
        source.change.emit();
    """)
)

layout = row(p1)

show(layout)

1 Ответ

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

Главное отметить, что BokehJS может только автоматически уведомлять об обновлениях, когда выполняются фактические назначения, например,

source.data = some_new_data

Это может вызвать обновление.Если вы обновите данные «на месте», то BokehJS не сможет это заметить.Вам нужно будет явно указать и позвонить source.change.emit(), чтобы сообщить BokehJS, что что-то было обновлено.

Однако вы также должны знать, что вы используете три разные вещи, которые давно устарели и будут удалены в выпуске после следующего.

  • cb_obj.get('selected')

    Нет необходимости использовать .get Вы можете просто получить доступ к свойствам напрямую:

    cb_obj.selected
    
  • Синтаксис ['1d'].Этот диктовый подход был очень неуклюжим и будет удален очень скоро.Для большинства выборов вам нужно свойство indices:

    source.selected.indices
    
  • source.callback

    Это древний специальный обратный вызов.Существует более новый общий механизм для обратных вызовов свойств, которые всегда должны использоваться вместо

    source.selected.js_on_change('indices', CustomJS(...))
    

    Обратите внимание, что в этом случае cb_obj является выбором, а не источником данных.

...