Javascript 添加小部件以切换所有Bokeh子地块中的行
因此,我试图创建一个6x6的绘图网格,其中每个绘图都有多条线。我想添加Bokeh的Javascript 添加小部件以切换所有Bokeh子地块中的行,javascript,python,bokeh,Javascript,Python,Bokeh,因此,我试图创建一个6x6的绘图网格,其中每个绘图都有多条线。我想添加Bokeh的CheckboxGroup小部件,以便能够为所有绘图打开和关闭线条。我很难弄清楚如何将小部件链接到所有绘图。当我运行此代码时,小部件&all plot我只能切换到最后一个plot。有什么建议吗 # create a list of subplots to iterate over ps = [figure(background_fill_color='#DFDFE5', plot_width=200,
CheckboxGroup
小部件,以便能够为所有绘图打开和关闭线条。我很难弄清楚如何将小部件链接到所有绘图。当我运行此代码时,小部件&all plot我只能切换到最后一个plot。有什么建议吗
# create a list of subplots to iterate over
ps = [figure(background_fill_color='#DFDFE5', plot_width=200,
plot_height=200) for i in range(36)]
for i in range(len(ps)):
# link the range of first plot with every other plot
ps[i].x_range = ps[0].x_range
ps[i].y_range = ps[0].y_range
# axes labels
ps[i].yaxis.axis_label = 'amplitude'
ps[i].xaxis.axis_label = 'age'
# plot data -- xaxis_arr & na are my data arrays
a = ps[i].line(xaxis_arr, na[0][i][2], line_width=2, color='#1f77b4')
b = ps[i].line(xaxis_arr, na[1][i][2], line_width=2, color='#ff7f0e')
c = ps[i].line(xaxis_arr, na[2][i][2], line_width=2, color='#2ca02c')
ps[i].title.text = i
customJScode = """
console.log(cb_obj.active);
line0.visible = false;
line1.visible = false;
line2.visible = false;
for (i in cb_obj.active) {
//console.log(cb_obj.active[i]);
if (cb_obj.active[i] == 0) {
line0.visible = true;
} else if (cb_obj.active[i] == 1) {
line1.visible = true;
} else if (cb_obj.active[i] == 2) {
line2.visible = true;
}
}
"""
callback = CustomJS(code=customJScode, args={} )
checkbox = CheckboxGroup(labels=["toggleLine1", "toggleLine2", "toggleLine3"],
active=[0,1,2], callback=callback)
callback.args = dict(line0=a, line1=b, line2=c, checkbox=checkbox)
myplots = gridplot(ps, ncols=6)
layout = column(myplots, widgetbox(checkbox))
show(layout)
在for循环的每一步中,都会用新代码和新参数覆盖复选框的callback属性,这就是为什么它只适用于最后一行。 在for循环中,应该填写行列表,以便在循环结束后将它们作为参数传递给CustomJS回调。然后您需要customJS代码一次处理所有行 以下是一个例子:
from bokeh.io import show
from bokeh.plotting import figure
from bokeh.models import CheckboxGroup, CustomJS
from bokeh.layouts import gridplot
import numpy as np
figlist = [figure(title='Figure '+str(i),plot_width=200,plot_height=200) for i in range(6)]
x=np.arange(10)
linelist=[]
for fig in figlist:
line0 = fig.line(x,x,color='blue')
line1 = fig.line(x,x[::-1],color='red')
line2 = fig.line(x,x**2,color='green')
linelist+=[[line0,line1,line2]]
checkbox = CheckboxGroup(labels=['line0','line1','line2'],active=range(3))
iterable = [elem for part in [[('_'.join(['line',str(figid),str(lineid)]),line) for lineid,line in enumerate(elem)] for figid,elem in enumerate(linelist)] for elem in part]
checkbox_code = ''.join([elem[0]+'.visible=checkbox.active.includes('+elem[0].split('_')[-1]+');' for elem in iterable])
checkbox.callback = CustomJS(args={key:value for key,value in iterable+[('checkbox',checkbox)]}, code=checkbox_code)
grid = gridplot([figlist[:3]+[checkbox],figlist[3:]])
show(grid)
我还有更复杂的示例代码,经常使用行可见性切换
您不需要将复选框作为参数传递给它自己的回调(您可以使用cb_obj),只是我经常对其他可能需要它的小部件重用相同的“iterable”和“checkbox_代码”