python - Bokeh:在散点图上使用框选择后如何更新数据表?

标签 python bokeh bokehjs

当我在 Bokeh 散点图上使用框选择时,我尝试自动更新数据表。该表应显示所选框中的所有元素。

这适用于 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))

当我选择散点图的一部分时,我希望更新数据表。 Image of Scatter Plot

Image of Data Table

最佳答案

如果我理解正确的话,我想我也遇到了同样的问题(see this post)。

解决方案可能是@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))

关于python - Bokeh:在散点图上使用框选择后如何更新数据表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55856322/

相关文章:

具有非 UTF-8 输出的 Python 的 subprocess.getoutput

python - Numpy 和 Scipy 与 Amazon Elastic MapReduce

php - 一个 Web 框架,其中 AJAX 不是事后的想法

python - Discord.py 如何从 DM channel 获取日志

python - 填充 Bokeh 中贝塞尔曲线之间的区域

javascript - 在python bokeh中将文件从客户端上传到服务器

bokeh - 如何为 Bokeh DataTable 中的行和/或单元格着色?

Python Bokeh : How to update a Toggle button - defined in the main - in a subroutine

javascript - 如何将工具栏添加到 BokehJS 绘图?