如何使用多个ColumnDataSource并一次更新所有这些文件?

时间:2018-04-10 17:40:35

标签: python python-3.x plot synchronization bokeh

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

问题描述

我有一堆数字,如下图所示。当我选择一些点时,应在所有图中绘制一些轮廓线。但问题是它们会在此图像中看到崩溃。

如果我缩小这两个数字,它们会再次恢复正常。我认为这是同步问题。

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

这是我更新配置文件行的源数据的代码片段,我在其中使用所选的配置文件圈索引重新创建CDSview。每个绘图执行一次此代码。如果表格中有4个图表,并且每个图表有3个配置文件,则如果用户进行一些选择,将有24个更新(每个CDS一个)。有没有办法一次更新所有内容以避免此问题?

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)

事实上,如果我这样做并且我在睡眠时暂停,那么轮廓线运行良好

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对于批量处理更有用:{{3} }

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,但由于https://github.com/bokeh/bokeh/blob/master/examples/howto/hold_app.py,它是不可能的。所以实现这一目标的唯一方法是只使用this filtering behaviour中描述的一个CDS?然后,我需要在当前源中添加许多列,这些列的大多数数据都会有NaN个值,这有点难看。

有更好的方法吗?

更新04/12/2018

  • 我也遇到time.sleep错误。
  • 我将尝试以不同的方式绘制配置文件,可能使用一个CDS和几个CDSViews,可能使用段而不是行。

2 个答案:

答案 0 :(得分:0)

如何按IFS延迟代码:

add_timeout_callback

答案 1 :(得分:0)

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

注意:但我找到了另一个setback