微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

散景:使用滑块进行慢速交互式数据过滤

如何解决散景:使用滑块进行慢速交互式数据过滤

此问题已在 Bokeh Discourse 上发布和回答。


我使用 JavaScript 回调(下面的 MWE)编写了一个带有 bokeh 的交互式数据可视化脚本。从大约 10k 数据点开始,数据过滤明显变慢,超过 100k 就无法使用。在 Jupyter Notebook 中运行代码时也会观察到这一点。这种效应在数据点较多的地区最为明显。

  • 这是预期的吗?如果没有,我该如何加快可视化速度?
  • 欢迎对代码提出一般性意见,特别是与正确/不正确使用 bokeh功能相关的意见。

谢谢。

import numpy as np
from bokeh.io import output_file,show
from bokeh.models import CDSView,ColumnDataSource as CDS,CustomJSFilter
from bokeh.models import CustomJS,RangeSlider,Range1d
from bokeh.plotting import figure
from bokeh.layouts import layout 
output_file('test.hml') # alternatively one Could use output_notebook()

#generate the data
npoints = 50000
data = dict(exp=np.random.exponential(1,size=npoints),gau=np.random.normal(0,0.5,)

source = CDS(data=data)

slider  = RangeSlider(start=0,end=10,value=(0,10),step=.1,title="Exp")

callback = CustomJS(args=dict(s=source),code="""
    s.change.emit();
""")
slider.js_on_change('value',callback)

filt = CustomJSFilter(args=dict(slider=slider),code="""
        var indices = [];
        var start = slider.value[0];
        var end = slider.value[1];

        for (var i=0; i < source.get_length(); i++){
            if (source.data['exp'][i] >= start && source.data['exp'][i] <= end){
                indices.push(true);
            } else {
                indices.push(false);
            }
        }
        return indices;
        """)

view = CDSView(source=source,filters=[filt])

fig = figure(plot_width=450,plot_height=350)
fig.circle(x='exp',y='gau',source=source,view=view)

#fix ranges (otherwise they change during filtering)
fig.x_range=Range1d(-1,11)
fig.y_range=Range1d(-3.5,3.5)

lay = layout([[slider],[fig]])
show(lay)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。