首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用多个ColumnDataSource并同时更新它们?

如何使用多个ColumnDataSource并同时更新它们?
EN

Stack Overflow用户
提问于 2018-04-10 17:40:34
回答 2查看 1.7K关注 0票数 2

我正在开发Bokeh服务器应用程序。我正在使用Bokeh 0.12.15

问题描述

我有一堆数字,你可以在下面的图片中看到。当我选择一些点,一些轮廓线应该绘制在所有的情节。但问题是,正如你在这张图片中所看到的那样,它们会崩溃。

如果我放大这两个数字,它们就又恢复正常了。我认为这是一个同步问题。

我有一个ColumnDataSource (CDS)可用于所有的地块。每个配置文件都有自己的CDS。

这是代码片段,我在其中更新概要文件行的源数据,并使用所选的配置文件圈索引重新创建CDSview。这段代码每情节执行一次。如果表单中有4个地块,并且每个地块有3个配置文件,如果用户做出一些选择,就会有24个更新(每个CDS一个)。有没有办法一次更新所有内容以避免这个问题?

代码语言:javascript
复制
prof_len = len(prof_cds)
prof_to_show = []
for i in range(prof_len):
    pos = NPROF - i - 1
    self.prof_lines[pos].data_source.data = prof_cds[i].data
    view = CDSView(source=self.env.source, filters=[IndexFilter(prof_indexes[i])])
    self.prof_circles[pos].view = view
    prof_to_show.append(pos)

事实上,如果我这样做的话,我在睡眠中停顿一下,轮廓线就能正常工作了。

代码语言:javascript
复制
prof_len = len(prof_cds)
prof_to_show = []
import time
for i in range(prof_len):
    pos = NPROF - i - 1
    self.prof_lines[pos].data_source.data = prof_cds[i].data

    lg.info('-- WAITING FOR UPDATE')
    time.sleep(2)

    view = CDSView(source=self.env.source, filters=[IndexFilter(prof_indexes[i])])
    self.prof_circles[pos].view = view
    prof_to_show.append(pos)

失败的解决办法

Bryan (Bokeh )告诉我要使用hold方法,但同样的问题也出现了。

我只看了一眼,但马上回答了你的最后一个问题,也许holdunhold可以更好地处理事情:app.py

代码语言:javascript
复制
self.env.doc.hold('combine')
for p_obj in self.env.bk_plots:
    p_obj.plot_profile_lines(new.indices)
self.env.doc.unhold()

结论

我认为这里的问题是,我正在使用一个CDS作为点和一个不同的CDS的轮廓线。我想使用同样的,并应用一些CDSView,但这是不可能的,因为this filtering behaviour。因此,实现这一目标的唯一方法是只使用this answer中描述的一个CDS?然后,我需要将许多列添加到当前源中,而且这些列的大多数数据都有NaN值,这有点难看。

有更好的方法吗?

更新04/12/2018

  • 我在time.sleep中也会出错。
  • 我将尝试以一种不同的方式绘制概要文件,可能使用一个CDS和几个CDSViews,也许使用分段而不是线条。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-18 10:28:04

最后我找到了解决办法。我使用Multiline字形来解决这个问题。像这样,我只需要使用一个ColumDataSource来进行所有的行更新。它的效率更高,应用程序也不会崩溃。

Note:但我找到了另一个setback

票数 0
EN

Stack Overflow用户

发布于 2018-04-12 00:23:31

add_timeout_callback延迟代码怎么样?

代码语言:javascript
复制
prof_len = len(prof_cds)
prof_to_show = []
import time
for i in range(prof_len):
    pos = NPROF - i - 1
    self.prof_lines[pos].data_source.data = prof_cds[i].data
    def callback(i=i, pos=pos):
        view = CDSView(source=self.env.source, filters=[IndexFilter(prof_indexes[i])])
        self.prof_circles[pos].view = view
        prof_to_show.append(pos)
    curdoc().add_timeout_callback(callback, 100)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49759896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档