Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.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 使用带滑块的CustomJS回调打印不同的列_Python_Bokeh - Fatal编程技术网

Python 使用带滑块的CustomJS回调打印不同的列

Python 使用带滑块的CustomJS回调打印不同的列,python,bokeh,Python,Bokeh,我有一个由多列组成的简单ColumnDataSource,每列表示一个模拟的不同日期,每行表示状态为a、b、c、…的实体数,。。等,我想能够通过滑动通过天(列)擦洗 我已经看了一看,和博克的信息,但我还没有能够成功地让它工作。我有以下代码(最少): 来自bokeh.plotting导入图的 从bokeh.layouts导入列,widgetbox 从bokeh.models导入CustomJS、Slider、ColumnDataSource和ranges 从bokeh.io导入输出文件,显示 输出

我有一个由多列组成的简单ColumnDataSource,每列表示一个模拟的不同日期,每行表示状态为a、b、c、…的实体数,。。等,我想能够通过滑动通过天(列)擦洗

我已经看了一看,和博克的信息,但我还没有能够成功地让它工作。我有以下代码(最少):

来自bokeh.plotting导入图的

从bokeh.layouts导入列,widgetbox
从bokeh.models导入CustomJS、Slider、ColumnDataSource和ranges
从bokeh.io导入输出文件,显示
输出_文件(“barplot.html”)
模拟时间=4
数据={'x':['a','b','c','d','e','f','g','h'],
'0': [2860.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
'1': [2860.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
'2': [0.0, 2860.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
'3': [0.0, 2860.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]}
source=ColumnDataSource(数据)
条形图=图形(绘图宽度=800,绘图高度=600,工具=平移,x轴标签=状态,x范围=源。数据['x'],y范围=范围。范围1d(开始=0,结束=3000))
vbar(源=源,x='x',顶部='0',宽度=0.6)
callback=CustomJS(args={'source':source},code=“”
console.log('changed selected time',cb_对象值);
var数据=source.data;
数据['0']=数据[cb_对象值];
source.change.emit()
""")
时间滑块=滑块(开始=0,结束=模拟时间-1,值=1,步骤=1,回调=回调)
callback.args[“time”]=时间滑块
显示(列(条形图、时间滑块))
i、 e.我无法使用滑块在列中滑动

我做错了什么

干杯

试试这个:

data = {'x': ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'],
        'y': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
        '0': [0.0, 0.0, 0.0, 0.0, 500.0, 0.0, 0.0, 0.0],
        '1': [0.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
        '2': [0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0],
        '3': [0.0, 0.0, 0.0, 1000.0, 0.0, 0.0, 0.0, 0.0]}

source = ColumnDataSource(data)

barplot = figure(plot_width=800, plot_height=600, tools='pan',
                 x_axis_label='Status', x_range=source.data['x'],
                 y_range=ranges.Range1d(start=0, end=3000))
barplot.vbar(source=source, x='x', top='y', width=0.6)

callback = CustomJS(args=dict(source=source), code="""
    console.log(' changed selected time', cb_obj.value);
    var data = source.data;
    data['y'] = data[cb_obj.value];
    source.change.emit()
""")

time_slider = Slider(start=0, end=sim_time-1, value=0, step=1, callback=callback)
callback.args["time"] = time_slider    
show(column(barplot, time_slider))

您的代码有两个问题。
0
1
2
3
的条形图是相同的。选择2和3之间不会有任何变化。此外,还可以使用
0
列存储数据。但随后您将覆盖JS代码中
0
中的数据。因此,数据丢失。因此,在滑块上切换回0不会产生效果。这就是为什么我在数据中添加了一个新的(空)列
y
。这只是一个占位符,用于打印当前选定的数据。

感谢您的快速回复!我采纳了你所有的建议,但擦洗仍然不起作用。查看浏览器控制台时,它告诉我source.change.emit()抛出类型错误“undefined is not a object”。有什么想法吗?解决了这个问题——这个功能在Bokeh0.12.5上被破坏了,但在0.12.7上是完全可用的。