2017-05-19 1 views
0

IPython Note에서 내 데이터를 시각화하기 위해 bokeh를 사용하여 플롯을 작성하려고합니다. 좀 더 대화식으로 만들기 위해 위젯을 추가하고 싶습니다. 다음은 코드의 예입니다. 내가 그런 내가 다른 옵션을 선택하면 있는지 확인하려면 Bokeh 위젯 데이터 조각 내기

enter image description here

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) 

은, 플롯 그에 따라 나는 콜백 함수에서 지정한 기준에 따라 변경됩니다. 코드가 작동하지 않는 이유에 대한 제안?

P. 여기에서 코드를 사용했지만 직면하는 문제가 위와 비슷하기 때문에 위젯을 변경합니다. http://bokeh.pydata.org/en/0.11.1/docs/user_guide/interaction.html#customjs-with-a-python-function

답변

0

실제로 데이터 [ 'x'], 데이터 [ 'y '] 또는 데이터 ['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) 
관련 문제