Боке: как обновить таблицу данных после использования поля выбора на точечной диаграмме?

Я пытаюсь обновить таблицу данных автоматически, когда использую выделение поля на диаграмме рассеяния боке. В таблице должны отображаться все элементы, находящиеся в выбранном поле.

Это для Bokeh версии 1.0.4. Python 3.5 Я пробовал несколько способов сделать это, но у меня ничего не получилось.

from random import random
from bokeh.models import CustomJS, ColumnDataSource, Row
from bokeh.plotting import figure, curdoc
from bokeh.models.widgets import Button, TableColumn, DataTable


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

s1 = ColumnDataSource(data=dict(x=x, y=y))
s2 = ColumnDataSource(data=dict(x=[], y=[]))
p1 = figure(plot_width=400, plot_height=400, tools="pan, wheel_zoom, lasso_select, box_zoom, reset", title="Select Here")
p1.circle('x', 'y', source=s1, alpha=0.6)
columns = [TableColumn(field ="x",  title = "X axis"),
           TableColumn(field ="y",  title = "Y axis")]

p2 = DataTable(source =s2, columns = columns, width =155, height = 380)

s1.selected.js_on_change('indices', CustomJS(args=dict(s1=s1, s2=s2, p2=p2), code="""
        var inds = cb_obj.indices;
        var d1 = s1.data;
        var d2 = s2.data;
        d2['x'] = []
        d2['y'] = []
        for (var i = 0; i < inds.length; i++) {
            d2['x'].push(d1['x'][inds[i]])
            d2['y'].push(d1['y'][inds[i]])
        }
        s2.change.emit();
        p2.change.emit();
    """)
)

def get_values():
    print(s2.data)

button = Button(label = "Get selected set")
button.on_click(get_values)

curdoc().add_root(Row(p1, p2, button))

Я хочу обновить таблицу данных, когда выбираю часть диаграммы рассеяния. Изображение диаграммы рассеяния < / а>

Изображение таблицы данных


person Kunal Katdare    schedule 25.04.2019    source источник
comment
Я надеялся запустить код для исследования, но это не полный минимальный репродуктор. Пожалуйста, обновите код в вашем вопросе, чтобы он был конкурентоспособным (работоспособным).   -  person bigreddot    schedule 26.04.2019
comment
@bigreddot, я редактировал код. Теперь должно быть воспроизводимо. Спасибо!   -  person Kunal Katdare    schedule 26.04.2019


Ответы (1)


Если я правильно вас понял, думаю, у меня была такая же проблема (см. этот пост).

Решение может быть таким, как предоставлено @Tony:

from random import random
from bokeh.models import CustomJS, ColumnDataSource, Row
from bokeh.plotting import figure, curdoc
from bokeh.models.widgets import Button

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

s1 = ColumnDataSource(data = dict(x = x, y = y))
p1 = figure(plot_width = 400, plot_height = 400, tools = "lasso_select", title = "Select Here")
p1.circle('x', 'y', source = s1, alpha = 0.6)

s2 = ColumnDataSource(data = dict(x = [], y = []))
p2 = figure(plot_width = 400, plot_height = 400, x_range = (0, 1), y_range = (0, 1), tools = "", title = "Watch Here")
p2.circle('x', 'y', source = s2, alpha = 0.6)

s1.selected.js_on_change('indices', CustomJS(args = dict(s1 = s1, s2 = s2), code = """
        var inds = cb_obj.indices;
        var d1 = s1.data;
        d2 = {'x': [], 'y': []}
        for (var i = 0; i < inds.length; i++) {
            d2['x'].push(d1['x'][inds[i]])
            d2['y'].push(d1['y'][inds[i]])
        }
        s2.data = d2  """))

def get_values():
    print(s2.data)

button = Button(label = "Get selected set")
button.on_click(get_values)

curdoc().add_root(Row(p1, p2, button))
person horseshoe    schedule 26.04.2019
comment
@KunalKatdare, если ответ решил вашу проблему, просто примите его, чтобы другие могли его использовать. Если вы нашли другое решение, вы можете опубликовать его в качестве ответа, чтобы другие могли его использовать. - person horseshoe; 29.04.2019