У меня есть приложение bokeh (v0.11), которое создает график рассеяния, используя (x, y) координаты из кадра данных. Я хочу добавить взаимодействия таким образом, что когда пользователь либо выбирает точки на графике, либо вводит имя разделенных запятыми точек в текстовом поле (т.е. "P55, p1234" ), тогда эти точки будут красными на участке рассеяния.
Я нашел один способ сделать это (Стратегия № 3 ниже), но для больших кадров данных это очень медленно. Я думаю, что есть лучший метод. Может кто-нибудь мне помочь? Я пропустил какой-то очевидный вызов функции?
- Стратегия 1 (< 1ms на 100 точек) сверла в данные ColumnDataSource для существующего графика и пытается изменить выбранные точки.
- Стратегия 2 (~ 70 мс на 100 точек) перезаписывает существующий ColumnDataSource на основе созданного источника ColumnDataSource.
- Стратегия 3 (~ 400 мс на 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 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