在Bokeh(0.11)服务器应用程序中刷新/更新绘图的快速而正确的方法是什么?

时间:2016-01-24 00:19:24

标签: python bokeh

我有一个散景(v0.11)服务应用程序,它使用数据框中的(x,y)坐标生成散点图。我想添加交互,以便当用户选择绘图上的点或在文本框中输入逗号分隔点的名称(即" p55,p1234")时,这些点将变为红色在散点图上。

我找到了一种方法来实现这一点(下面的策略#3),但对于大型数据帧来说速度非常慢。我认为有更好的方法。谁能帮我吗?我错过了一些明显的函数调用吗?

  • 策略1 (< 1ms,100分)钻入存在图的ColumnDataSource数据,并尝试更改所选点。
  • 策略2 (每100分约70毫秒)使用新创建的ColumnDataSource覆盖图表的现有ColumnDataSource。
  • 策略3 (每100分约400毫秒)是策略2,然后重新创建 图。

代码存放在pastebin上:http://pastebin.com/JvQ1UpzY最相关的部分复制在下面。

def refresh_graph(self, selected_points=None, old_idxs=None, new_idxs=None):
    # Strategy 1: Cherry pick current plot's source.
    # Compute time for 100 points: < 1ms.
    if self.strategy == 1:
        t1 = datetime.now()
        for idx in old_idxs:
            self.graph_plot.data_source.data['color'][idx] = 'steelblue'
        for idx in new_idxs:
            self.graph_plot.data_source.data['color'][idx] = 'red'
        print('Strategy #1 completed in {}'.format(datetime.now() - t1))
    else:
        t3 = datetime.now()
        self.coords['color'] = 'steelblue'
        self.coords.loc[selected_points, 'color'] = 'red'
        new_source = bkmodels.ColumnDataSource(self.coords)
        self.graph_plot = self.graph_fig.scatter('x', 'y', source=new_source, color='color', alpha=0.6)
        print('Strategy #3 completed in {}'.format(datetime.now() - t3))
    return

理想情况下,我希望能够使用策略#1 ,但它似乎不允许在客户端浏览器中刷新点数。

感谢您的帮助!

仅供参考:我使用的是RHEL 6.X

1 个答案:

答案 0 :(得分:8)

如果你是流媒体数据,那么这里有一个相关的答案:Timeseries streaming in bokeh

如果您需要一次更新所有内容,那么您可以执行此操作,我的建议是您的策略1 ,已证明,例如这里:

https://github.com/bokeh/bokeh/blob/master/examples/app/sliders.py

需要特别注意的是,您必须一次更新所有source.data。其中一个假设是列数据源的所有列始终具有相同的长度。更新单个列存在破坏此假设的风险,这可能会导致问题。因此,您希望立即更新所有内容,例如:

# Generate the new curve
x = np.linspace(0, 4*np.pi, N)
y = a*np.sin(k*x + w) + b

source.data = dict(x=x, y=y)