我有一个散景(v0.11)服务应用程序,它使用数据框中的(x,y)坐标生成散点图。我想添加交互,以便当用户选择绘图上的点或在文本框中输入逗号分隔点的名称(即" p55,p1234")时,这些点将变为红色在散点图上。
我找到了一种方法来实现这一点(下面的策略#3),但对于大型数据帧来说速度非常慢。我认为有更好的方法。谁能帮我吗?我错过了一些明显的函数调用吗?
代码存放在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
答案 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)