散景:滑动数据集的曲线

时间:2017-04-15 11:33:26

标签: python callback bokeh

我在模拟中执行了参数扫描,并希望根据我想要使用滑块的参数绘制不同的曲线。 我以前做过一些散景,这个例子应该非常简单,但是当我移动我的滑块时,我似乎无法理解为什么情节会消失: 这是MWE:

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from itertools import product

from bokeh.layouts import row, widgetbox
from bokeh.models import CustomJS, Slider
from bokeh.plotting import figure, output_file,output_notebook, show, ColumnDataSource
output_notebook()

#synthetic data, 3 cos curves with different frequencies.
x=np.linspace(0,15,1000)
x=x.repeat(3).reshape(1000,3).T
y=np.zeros((3,np.shape(x)[1]))
y[0]=np.cos(x[0])
y[1]=np.cos(2*x[0])
y[2]=np.cos(3*x[0])


all_plots = ColumnDataSource(data=dict(x=x,y=y))
one_plot = ColumnDataSource(data=dict(x=x[0],y=y[0]))

plot = figure(y_range=(-1,1), plot_width=800, plot_height=400)
plot.line('x', 'y', source=one_plot, line_width=3, line_alpha=0.6)

callback = CustomJS(args=dict(da=all_plots,dp=one_plot), code="""
    var dall = da.get('data');
    var dplot = dp.get('data');

    var idx = slider_plot.get('value');

    dplot['x'] = dall['x'][idx];
    dplot['y'] = dall['y'][idx];

    dp.trigger('change');
    da.trigger('change');

""")
slider_plot = Slider(start=0, end=2, value=0, step=1,title="Freq", callback=callback)
callback.args["slider_plot"] = slider_plot



layout = column(widgetbox(slider_plot), plot)
show(layout)

当我移动滑块时,情节就会消失。我无法找到错误。

干杯

编辑:似乎错误来自处理ColumnDataSource中的多维numpy数组。

dplot['x'] = dall['x'][idx];
dplot['y'] = dall['y'][idx];

这些行似乎导致错误。通过创建一个索引2-D数组的每一行的数据源,可以解决这个问题,

source_x=ColumnDataSource(data=dict([(str(i),x[i]) for i in range(len(x))]))
source_y=ColumnDataSource(data=dict([(str(i),y[i]) for i in range(len(x))]))

按其位置,所以source_x.data [' 0']将是第一行等等。然后它就可以了。但是,对于大型参数扫描,以这种方式创建ColumnDataSource变得非常慢。难道没有办法以干净的方式访问2D np.array的条目吗?

0 个答案:

没有答案