Что такое быстрый и правильный способ обновления / обновления участков в серверном приложении Bokeh (0.11)?
У меня есть боке (v0.11) служить приложение, которое производит диаграмму рассеяния с использованием (x,y) координаты из фрейма данных. Я хочу добавить такие взаимодействия, когда пользователь либо выбирает точки На графике, либо вводит имя точек, разделенных запятыми, в текстовое поле (т. е. "p55, p1234"), то эти точки станут красными на диаграмме рассеяния.
Я нашел один способ выполнить это (стратегия #3, ниже), но это ужасно медленно для больших фреймов данных. Я думаю, что есть лучший способ. Кто-нибудь может мне помочь? Я пропустил какой-то очевидный вызов функции?
- Стратегия 1 (
- стратегия 2 (~70 МС на 100 точек) перезаписывает существующий ColumnDataSource участка с вновь созданным ColumnDataSource.
- Стратегия 3 (~400ms на 100 пунктов) стратегия 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, но это, похоже, не позволяет точкам обновляться в браузере клиента.
Спасибо за любую помощь!
FYI: я использую RHEL 6.X
1 ответов
Если вы потокового данные, то здесь есть соответствующий ответ:Timeseries потокового в Боке
Если вам нужно обновить все сразу, то вы можете это сделать, и мое предложение-ваше Стратегия 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)