Я пытаюсь создать своего рода приборную панель для мониторинга данных ЭКГ и соответствующих функций. При «оживлении» ЭКГ путем постоянного обновления двух ColumnDataSource
с, очень скоро сюжет начинает заикаться и становится медленным. В данный момент я запускаю это в ноутбуке, но то же самое с сервером bokeh.
Сама ЭКГ показывает около последней секунды, около 400 точек данных в строке. Оставленный сам по себе, он работает почти гладко, но это не очень полезно, с точки зрения панели управления. На другом графике показана вариабельность сердечного ритма, возможно, дюжина кругов, но полученная из последней минуты данных, таким образом, из двух источников.
Кажется, что чем больше собрано в источниках данных и чем быстрее происходят обновления, тем медленнее становится построение графиков. Параметр rollover
, равный ColumnDataSource.stream()
, сокращает общую длину собираемого материала, но в конечном итоге не предотвращает заикание.
Вероятно, в моем коде есть ошибка новичка, так как я считаю, что bokeh должно быть хорошо оборудовано для визуализации такого количества данных. Итак, вот что я делаю для черчения:
dashboard_source = ColumnDataSource(record[:1]) # initialize with first row
ecg_source = ColumnDataSource(record[:1]) # initialize with first row
# some options
time_window = 12 # seconds to keep in view
ecg_length = 1 # seconds to keep in view in ECG plot
update_rate = 1000 / sampling_rate # number of milliseconds between each plot update
# update function in which source data is fed from record dataframe
current_record_pos = 1
def update_dashboard_source():
global current_record_pos
new_row = record.iloc[current_record_pos]
dashboard_source.stream(new_row, rollover = sampling_rate * time_window)
ecg_source.stream(new_row, rollover = sampling_rate * ecg_length)
current_record_pos += 1
def ecg_dashboard(doc):
# dashboard element: ECG plot/s ---- ------- ---- ------- ---- ------- ---- -------
ecg_plot = figure(width=800, height=400, title='ECG', x_axis_label='time in ms', y_range=(-1, 1.5))
# plot ECG channels
for record_channel, color in zip(record_channels, ['green', 'blue']):
ecg_plot.line(source=ecg_source, x='time_ms', y=record_channel, alpha=.3, legend=record_channel+' ', color=color)
# dashboard element: heart rate variability ---- ------- ---- ------- ---- ------- ---- -------
hrv_plot = figure(width=400, height=400, title='heart rate variability', x_axis_label="r'r''", y_axis_label="r''r'''")
hrv_plot.circle(source=dashboard_source, x='r_diff_1', y='r_diff_2', size=10, alpha=.23)
# gather everything in a dashboard element and add it to the document
ecg_row = row(ecg_plot)
feature_row = row(hrv_plot)
dashboard = column(ecg_row, feature_row)
doc.add_root(dashboard)
doc.add_periodic_callback(update_dashboard_source, update_rate)
show(ecg_dashboard)
Я не нашел руководство пользователя bokeh очень полезным в отношении обновленных графиков. Может быть, где-то есть коллекция лучших практик?