2017-10-26 5 views
1

したがって、各プロットに複数の行がある6x6グリッドのプロットを作成しようとしています。私はBokehのCheckboxGroupウィジェットを追加して、すべてのプロットに対してラインのオン/オフを切り替えることができます。ウィジェットをすべてのプロットにリンクする方法を調べることができません。私がこのコードを実行すると、ウィジェット&すべてのプロット私は最後のプロットだけを切り替えることができます。助言がありますか?あなたのforループの各ステップすべてのBokehサブプロットの行を切り替えるウィジェットを追加する

# 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) 

答えて

1

それだけであなたの最後の行のために働くなぜ、あなたは新しいコードを使用して、チェックボックスのコールバック属性を上書きし、新しい引数されている、それはです。 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) 

私もラインの可視性を使用し、より複雑なコード例を持っているあなたは、引数としてチェックボックスを渡す必要はありませんmy bitbucket repository

に、多くのことを切り替えます独自のコールバック(ちょうどcb_objを使うことができます)、それは必要なことができる他のウィジェットに対して同じ "iterable"と "checkbox_code"を頻繁に再利用することです。

関連する問題