Python bokeh:通过数据集曲线的滑块
我已经在模拟中执行了参数扫描,并希望根据参数绘制不同的曲线,通过这些曲线我希望使用滑块。 我以前做过一些博克,这个例子应该很简单,但我似乎不明白为什么当我移动滑块时,绘图消失了: 这里是MWE:Python bokeh:通过数据集曲线的滑块,python,callback,bokeh,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
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];
这些行似乎导致了错误。有一种方法可以解决这个问题,通过创建一个数据源来索引二维数组的每一行
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的条目?对,回调是JavaScript代码,在浏览器中运行。在JavaScript或浏览器中没有NumPy,也没有多维数组。特别是,没有切片,因此
dall['x'][idx]
不会拉出一维切片。它只是从JS看到的一个大1d数组中的idx
中取出一个数字。但是BokehJS期望的是一个数组,而不是一个数字,这可能是问题的直接原因。您最好的选择是使用idx
以及在回调中使用JavaScript组装所需的片段。事实上,通过将二维阵列视为一个堆叠的一维阵列,我们只需要以idx*x.length:(idx+1):x.length的形式跨过它。如果你自己回答这个问题,我很乐意投赞成票。