如何解决Python bokeh回调函数滑块
有人可以解释一下,为什么这什么都不做,以及如何从回调函数中打印值?问题必须在于回调函数。我希望通过一个独立的html文件中的日期范围滑块来更新我的绘图,但是当我更改滑块的值时什么也没发生。
import numpy as np
import pandas as pd
from datetime import datetime
from bokeh.models import ColumnDataSource,DatetimeTickFormatter,HoverTool
from bokeh.models.widgets import DateRangeSlider
from bokeh.layouts import layout,column
from bokeh.models.callbacks import CustomJS
from bokeh.plotting import figure,output_file,show,save
datesX = pd.date_range(start='2018-01-02',periods=100)
# valuesY = pd.DataFrame(np.random.randint(0,25,size=(100,1)),columns=list('A'))
np.random.seed(0)
valuesY = np.random.rand(100)
source = ColumnDataSource(data={'x': datesX,'y': valuesY})
# output to static HTML file
output_file('file.html')
hover = HoverTool(tooltips=[('Timestamp','@x{%Y-%m-%d %H:%M:%S}'),('Value','@y')],formatters={'@x': 'datetime'})
date_range_slider = DateRangeSlider(title="Zeitrahmen",start=datesX[0],end=datesX[99],\
value=(datesX[0],datesX[99]),step=1,width=1000)
# create a new plot with a title and axis labels
p = figure(title='file1',x_axis_label='Date',y_axis_label='yValue',x_axis_type='datetime',tools="pan,wheel_zoom,box_zoom,reset",plot_width=1000,plot_height=700)
# add a line renderer with legend and line thickness
p.line(x='x',y='y',source=source,line_width=2)
p.add_tools(hover)
callback = CustomJS(args=dict(source=source),code="""
var data = source.data;
var a = cb_obj.value;
var xmin = a[0];
var xmax = a[1];
var x = data['x'];
var y = data['y'];
for (var i = 0; i < x.length; i++) {
if (data['x'][i] == xmin){
startidx = i;
}
if (data['x'][i] == xmax){
endidx = i;
}
}
int j=0;
while(j <= endidx-startidx){
x[j] = data['x'][startidx+j];
y[j] = data['y'][startidx+j];
j++;
}
source.change.emit();
""")
date_range_slider.js_on_change('value',callback)
layout = column(p,date_range_slider)
# show the results
show(layout)
解决方法
开发JS回调时,必须了解如何查看浏览器的JavaScript控制台。这因浏览器而异,因此您将必须搜索如何在所使用的特定浏览器上访问控制台。
一旦您看到控制台,您将看到您的代码有错误:
SyntaxError:意外的标识符“ j”
因为您的回调代码中包含int j
而不是var j
。它已修复,然后出现另一个错误:
ReferenceError:找不到变量:endidx
目前尚不清楚您实际想要执行的操作,因此实际上不可能真正尝试完全修复代码,但是希望这会为您提供正确进行调试所需的信息。其他一些调试提示:
-
要在控制台中“打印”,请使用
console.log(...)
-
您还可以在回调代码中添加命令
debugger
。如果您在BOKEH_MINIFIED=no
下运行Bokeh脚本,并且浏览器开发工具窗口打开,则执行将在此时停止,您可以单步执行代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。