2017-05-19 5 views
0

私はIPythonのノートブックに自分のデータを視覚化するためにボケを使ってグラフを作成しようとしています。私はそれをよりインタラクティブにするためにいくつかのウィジェットを追加したいと思います。以下はコードの例です。ボケウィジェットスライスデータ

from bokeh.models import CustomJS, ColumnDataSource 
from bokeh.plotting import Figure, output_notebook, show 
from bokeh.models.widgets import Select 
from bokeh.layouts import column 

output_notebook() 

x = [x*0.005 for x in range(0, 200)] 
y = x 
z = ['A' if i>50 else 'B' for i in range(len(x))] 

source = ColumnDataSource(data=dict(x=x, y=y, z=z)) 

plot = Figure(plot_width=400, plot_height=400) 
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6) 

def callback(source=source): 
    data=source.get('data') 
    f = cb_obj.get('value') 
    x, y, z = data['x'], data['y'], data['z'] 
    x = [x[i] for i in range(len(x)) if z[i] == f] 
    y = [y[i] for i in range(len(y)) if z[i] == f] 
    z = [z[i] for i in range(len(z)) if z[i] == f] 
    source.trigger('change') 

slides = Select(title="Option:", value = 'A', options=['A', 'B'], 
       callback=CustomJS.from_py_func(callback)) 

layout = column(slider,plot) 

show(layout) 

enter image description here

私はそれは、そのような私は他のオプションを選択した場合、プロットは、私がコールバック関数に指定した基準に基づいて、それに応じて変化することにしたいです。コードが機能しない理由についてのご意見はありますか?

P.S.私はここからコードを使用しましたが、私が直面している問題は上記と似ているので、私はウィジェットを変更しますhttp://bokeh.pydata.org/en/0.11.1/docs/user_guide/interaction.html#customjs-with-a-python-function

答えて

0

実際にはデータ['x']、データ['y ']またはdata [' z ']を使用します。

第二の問題は、ソースデータを変更した場合、それはもはやあなたが始まった完全なデータが含まれているとして、あなたはそれをバックに変更しないカント、です。 回避策は、元のデータをコールバックに渡し、元のデータを変更することなく、フィルタ処理されたデータをColumnDataSourceに割り当てます。

from bokeh.models import CustomJS, ColumnDataSource 
from bokeh.plotting import Figure, output_notebook, show 
from bokeh.models.widgets import Select 
from bokeh.layouts import column 

output_notebook() 

x = [x*0.005 for x in range(0, 200)] 
y = x 
z = ['A' if i>50 else 'B' for i in range(len(x))] 

original_source = ColumnDataSource(data=dict(x=x, y=y, z=z)) 
source = ColumnDataSource(data=dict(x=x, y=y, z=z)) 

plot = Figure(plot_width=400, plot_height=400) 
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6) 

def callback(source=source, original_source = original_source): 
    data=original_source.data 
    s_data = source.data 
    f = cb_obj.value 
    x, y, z = data['x'], data['y'], data['z'] 
    x = [x[i] for i in range(len(x)) if z[i] == f] 
    y = [y[i] for i in range(len(y)) if z[i] == f] 
    z = [z[i] for i in range(len(z)) if z[i] == f] 
    s_data['x'] = x 
    s_data['y'] = y 
    s_data['z'] = z 
    source.trigger('change') 

slides = Select(title="Option:", value = 'A', options=['A', 'B'], 
       callback=CustomJS.from_py_func(callback)) 

layout = column(slides,plot) 

show(layout)