【问题标题】:Bokeh: Add annotations/glyphs from server callback散景:从服务器回调中添加注释/字形
【发布时间】:2020-09-27 21:04:18
【问题描述】:

我正在尝试从服务器回调中添加注释。回调应该“包裹”一个带有区域的点击点。

我的代码如下所示:

import numpy as np
from bokeh.models import BoxAnnotation
from bokeh.server.server import Server
from bokeh.plotting import figure


def _app(doc):
    p = figure(tools=['tap'])

    x = np.random.random(size=1000) - .5
    x_cum = np.cumsum(x)
    t = np.arange(len(x))

    s = p.scatter(t, x_cum)

    def handler(attr, old, new):
        print('attr: {} old: {} new: {}'.format(attr, old, new))

        new_layout = []

        for t in new:
            new_layout.append(BoxAnnotation(left=t - 5, right=t + 5, fill_color='green', fill_alpha=.3, level='underlay'))

        p.center = new_layout


    s.data_source.selected.on_change('indices', handler)

    doc.add_root(p)


server = Server({'/': _app}, num_procs=1)
server.start()

if __name__ == '__main__':
    server.io_loop.add_callback(server.show, "/")
    server.io_loop.start()

我也尝试了p.add_layout 而不是设置p.center 但没有。我看到对于 Jupyter 笔记本来说,push_notebook() 函数可能在这里可以工作,所以对于服务器来说类似的东西可能会工作吗?

【问题讨论】:

    标签: python bokeh


    【解决方案1】:

    您的代码在设置回调之前就因异常而失败。您应该收到RuntimeError: Columns need to be 1D (y is not) 错误。要修复它,请替换

    x = np.random.random(size=(1, 1000)) - .5
    x_cum = np.cumsum(x, axis=1)
    

    x = np.random.random(size=(1000,)) - .5
    x_cum = np.cumsum(x)
    

    并且绝对使用add_layout 而不是覆盖整个center 属性,因为后者会删除那里的其他内容,例如网格线。 请注意,只是一遍又一遍地调用add_layout 只会添加新注释而不会删除旧注释。如果要删除,可以直接设置center属性,但使用过滤后的旧值排除所有BoxAnnotation实例。

    【讨论】:

    • 我不得不稍微修改一下我的代码,这就是发生异常的原因。对于另一部分,这无关紧要。我希望显示这些框,但未显示它们。当您运行代码并点击散点时,会出现一个框吗?
    • 您的回答并没有直接帮助我。然而,这很有帮助,因为我意识到它可能对你有用而不是对我有用的代码。我检查了我拥有的软件包的版本,结果发现我的版本是 2.0.1,最新的是 2.3.dev1。我更新到最新版本,它解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    相关资源
    最近更新 更多