如何防止口吃的“动画”散景图

问题描述 投票:0回答:1

我正在尝试创建一种用于监控心电图数据和相关功能的仪表板。当通过不断更新两个ColumnDataSources来“动画化”心电图时,很快情节会开始出现口吃和增长缓慢。目前,我在笔记本电脑上运行它,但它与散景服务器相同。

心电图本身显示最新的第二个,一行中约400个数据点。离开它自己,几乎顺利,但这不是真正有用的,仪表板方面。另一个图显示了心率变异性,可能是十几个圆,但是从最后一分钟的数据得出,因此两个来源。

似乎数据源中收集的越多,更新发生得越快,绘图就越慢。 rolloverColumnDataSource.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的用户指南对更新的绘图很有帮助。某处可能有一系列最佳实践吗?

animation plot bokeh
1个回答
0
投票

在评论中结束对话:每次向绘图添加单个点时,将重新绘制浏览器中的整个画布区域。这就是浏览器的工作方式。 sampling_rate为250导致每秒250个绘图更新,即每4ms更新一次。这将使浏览器运行越来越慢,因为每4ms渲染(重新重绘)的点数将增加。

我建议将更新周期从4ms增加到大约100ms(可能使用更大的数据包)

© www.soinside.com 2019 - 2024. All rights reserved.