我正在尝试创建一种用于监控心电图数据和相关功能的仪表板。当通过不断更新两个ColumnDataSource
s来“动画化”心电图时,很快情节会开始出现口吃和增长缓慢。目前,我在笔记本电脑上运行它,但它与散景服务器相同。
心电图本身显示最新的第二个,一行中约400个数据点。离开它自己,几乎顺利,但这不是真正有用的,仪表板方面。另一个图显示了心率变异性,可能是十几个圆,但是从最后一分钟的数据得出,因此两个来源。
似乎数据源中收集的越多,更新发生得越快,绘图就越慢。 rollover
的ColumnDataSource.stream()
参数削减了收集的总长度,但最终不会阻止口吃。
我的代码中可能存在一些菜鸟错误,因为我觉得散景应该能够很好地显示这么多数据。所以,这是我为绘图做的事情:
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的用户指南对更新的绘图很有帮助。某处可能有一系列最佳实践吗?
在评论中结束对话:每次向绘图添加单个点时,将重新绘制浏览器中的整个画布区域。这就是浏览器的工作方式。 sampling_rate
为250导致每秒250个绘图更新,即每4ms更新一次。这将使浏览器运行越来越慢,因为每4ms渲染(重新重绘)的点数将增加。
我建议将更新周期从4ms增加到大约100ms(可能使用更大的数据包)