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