我对 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))

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



这种行为是否可以通过散景来实现?

最佳答案

由项目维护者编辑。

在 1.0 之前,围绕选择存在一些困惑和回归。对于任何 1.0 后版本,对于大多数用例,您现在希望在 'indices'selected 属性上使用回调:

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

这种用法现在在集成测试中得到持续和严格的维护,并且应该用于任何 1.0 后的 Bokeh 版本。
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))

更新较新的散景版本。在 0.12.16 版本上测试

由于 @Karel Marik 提到字形不能同时混合直接赋值和 ColumnDataSource。所以前面的代码不起作用。这是仅使用 source 的更新,其中还包括打印多项选择的代码(使用 shift + 单击):
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)

curdoc().add_root(column(p))

关于python - 来自工具的散景服务器回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42234751/

10-11 18:04