Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python bokeh:通过数据集曲线的滑块_Python_Callback_Bokeh - Fatal编程技术网

Python bokeh:通过数据集曲线的滑块

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

我已经在模拟中执行了参数扫描,并希望根据参数绘制不同的曲线,通过这些曲线我希望使用滑块。 我以前做过一些博克,这个例子应该很简单,但我似乎不明白为什么当我移动滑块时,绘图消失了: 这里是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];
这些行似乎导致了错误。有一种方法可以解决这个问题,通过创建一个数据源来索引二维数组的每一行

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的形式跨过它。如果你自己回答这个问题,我很乐意投赞成票。