Bokeh服务器回调工具

时间:2017-02-14 19:38:29

标签: python python-3.x callback bokeh

我是Python的新手,目前正在使用Bokeh进行交互式绘图可视化,我需要显示多个相关图表。为了实现这一点,我使用了散景服务器。

我一直在阅读文档和some examples,但我一直无法找到由绘图上的选择触发的python回调(在服务器中执行)的示例。基本上我想做的是:

from bokeh.plotting import figure, curdoc
from bokeh.layouts import column
from bokeh.models import ColumnDataSource

TOOLS = "tap"
p = figure(title="Some Figure", tools=TOOLS)

source = ColumnDataSource(dict(x=[[1, 3, 2], [3, 4, 6, 6]], y=[[2, 1, 4], [4, 7, 8, 5]], name=['A', 'B']))

p.patches('x', 'y', source=source, color=["firebrick", "navy"], alpha=[0.8, 0.3], line_width=2)


def callback():
    print("TapTool callback executed on Patch {}")


??? <- some code here linking the taptool with the callback function defined above


curdoc().add_root(column(p))

然后在执行服务器并单击补丁时:

  

2017-02-14 16:32:00,000在补丁A上执行TapTool回调

这种行为可以用散景来实现吗?

3 个答案:

答案 0 :(得分:9)

从项目维护者编辑。

对于导致1.0的选择,存在一些混乱和回归。对于任何1.0版本的版本,对于大多数用例,您现在想要在data -= np.mean(data, axis=0) data /= np.std(data, axis=0) 的{​​{1}}属性上使用回调:

'indices'

这种用法现在在集成测试下持续严格地维护,并且应该用于任何1.0 Bokeh版本。

selected事件可以链接到更新函数,如下所示:

source.selected.on_change('indices', callback)

更新较新的Bokeh版本。测试版本0.12.16

@Karel Marik所述,字形不能同时混合直接值赋值和selected。所以前面的代码不起作用。以下是仅使用from bokeh.plotting import figure, curdoc from bokeh.layouts import column from bokeh.models import ColumnDataSource TOOLS = "tap" p = figure(title="Some Figure", tools=TOOLS) source = ColumnDataSource(dict(x=[[1, 3, 2], [3, 4, 6, 6]], y=[[2, 1, 4], [4, 7, 8, 5]], name=['A', 'B'])) pglyph = p.patches('x', 'y', source=source, color=["firebrick", "navy"], alpha=[0.8, 0.3], line_width=2) def callback(attr, old, new): # The index of the selected glyph is : new['1d']['indices'][0] patch_name = source.data['name'][new['1d']['indices'][0]] print("TapTool callback executed on Patch {}".format(patch_name)) pglyph.data_source.on_change('selected',callback) curdoc().add_root(column(p)) 的更新,其中还包含用于打印多个选项的代码(使用shift + click):

ColumnDataSource

答案 1 :(得分:1)

Pablo发布的解决方案很棒,但它不适用于最近的散景版本(0.12.13)。我收到了运行时错误(提供用户定义的数据源,并且不能使用字形方法的可迭代值

以下为我工作......

from bokeh.plotting import figure, curdoc
from bokeh.layouts import column
from bokeh.models import ColumnDataSource

TOOLS = "tap"
p = figure(title="Some Figure", tools=TOOLS)

source = ColumnDataSource(dict(x=[[1, 3, 2], [3, 4, 6, 6]], y=[[2, 1, 4], [4, 7, 8, 5]], alphas = [0.8, 0.3], colors=["firebrick", "navy"], name=['A', 'B']))

pglyph = p.patches(xs='x', ys='y', source=source, line_width=2, alpha = 'alphas', color='colors')

def callback_fcn(attr, old, new):
    # The index of the selected glyph is : new['1d']['indices'][0]
    patch_name =  source.data['name'][new['1d']['indices'][0]]
    print("TapTool callback executed on Patch {}".format(patch_name))

pglyph.data_source.on_change('selected',callback_fcn)

curdoc().add_root(column(p))

答案 2 :(得分:1)

自bokeh 0.13起,@ Karel_Marik a提出的解决方案需要细微调整:

from bokeh.plotting import figure, curdoc
from bokeh.layouts import column
from bokeh.models import ColumnDataSource

TOOLS = ["tap"]
p = figure(title="Some Figure", tools=TOOLS)

source = ColumnDataSource(dict(
    x=[[1, 3, 2], [3, 4, 6, 6]],
    y=[[2, 1, 4], [4, 7, 8, 5]],
    name=['A', 'B'],color=["firebrick", "navy"],
    alpha=[0.8,0.3],line_width=[3,3]))

pglyph = p.patches('x', 'y', color="color", alpha="alpha",
                   line_width="line_width", source=source)

def callback(attr, old, new):
    # The index of the selected glyph is : new['1d']['indices'][0]
    selections = new['1d']['indices']
    print("Number of selections:{}".format(len(selections)))
    for index in selections:
        patch_name =  source.data['name'][index]
        print("TapTool callback executed on Patch {}".format(patch_name))

pglyph.data_source.on_change('selected',callback)

pglyph.selected.on_change('indices', callback)

curdoc().add_root(column(p))

我希望这对某人有帮助。