首页 > 解决方案 > 在散景图的轴上突出显示许多范围?

问题描述

我有一个数据散点图,想突出显示 x 轴的某些范围。当要突出显示的数字范围相对较小时,使用BoxAnnotation效果很好。但是,我正在尝试制作许多相邻的突出显示(具有不同的不透明度)。许多相邻BoxAnnotations的,缩小的,盒子稍微重叠,形成线条。此外,数千个BoxAnnotations需要很长时间才能生成,并且在与情节交互时运行不顺畅。

更具体地说,我有一些时间数据和一个预测模型,用于检测数据中发生某些事件的概率。我希望每个片段都以不透明度突出显示,该不透明度由事件在该时间点发生的概率给出。但是,我当前BoxAnnotation的方法会在缩小时导致框重叠的人造线(在放大区域时它们会消失),并且交互式绘图的响应速度很慢。

有没有办法在没有人工制品的情况下完成类似的事情并获得更流畅的体验?

当前方法:

source = ColumnDataSource(data=data_frame)
figure_ = figure(x_axis_label='Time', y_axis_label='Intensity')
for index in range(data_frame.shape[0] - 1):
    figure_.add_layout(
        BoxAnnotation(left=data_frame['time'].values[index], right=data_frame['time'].values[index + 1],
                      fill_alpha=data_frame['prediction'].values[index], fill_color='red', line_alpha=0)
    )
figure_.circle(x='time', y='intensity', source=source)
show(figure_)

当有太多小相邻时的人造线示例BoxAnnotations 在此处输入图像描述

在 x 轴上缩放时,线条消失: 在此处输入图像描述

标签: pythonbokeh

解决方案


可能没有任何方法可以挽救这种确切的方法。工件是由于底层光栅 HTML 画布的功能造成的,这里没有任何关于它的东西。并且任何缓慢都是由于这样一个事实,即这种使用BoxAnnotation(具有如此多的单个实例)根本不是所设想的,而且它根本没有优化以显示数百个实例,例如分散字形的方式。您正在尝试使用框注释来构建一种半透明的热图,由于上述原因,这并不适合它。

您可以通过使用以矢量化方式一次绘制所有框的单个rect或字形来克服缓慢的问题。vbar但这不会缓解合成问题。

最好的办法是使用可以更好地控制光栅化和合成细节的工具或代码创建一个半透明的“热图”图像覆盖自己。我真的不能详细地建议你如何做到这一点。Datashader库可能对此有用。


推荐阅读