2017-07-24 90 views
0

我有這樣的場景:如何使用Bokeh從Python調用JavaScript方法?

  1. 我有一些數據(在熊貓數據幀),我用它來畫我的陰謀
  2. 當我按下一個按鈕(由背景虛化部件內置),我可以打電話給我的回調方法,我在python中進行計算。
  3. 但是現在我想將計算的數據發回給用戶,以便在嚮導中顯示問題。所以我需要運行一些JavaScript函數。

我想創建一個虛擬按鈕,並從python運行此按鈕的點擊方法。但我認爲這是不可能的。

那麼,我怎樣才能直接從python運行JavaScript函數?

回答

1

截至散景0.12.6,能夠進行這種「遠程過程調用」的仍然是open feature request

與此同時,你最好的選擇是增加一個CustomJS callback某些模型的財產。 CustomJS可以執行任何你想要的JS代碼(包括調用其他JS函數),並會觸發任何屬性更新。

下面是一個示例,顯示每當滑塊更改時調用CustomJS。對於您的用例,您可能會添加一個不可見的圓形字形,並將CustomJS附加到字形的size屬性。更改glyph.size是您如何「調用」該功能。

from bokeh.layouts import column 
from bokeh.models import CustomJS, ColumnDataSource, Slider 
from bokeh.plotting import Figure, output_file, show 

output_file("js_on_change.html") 

x = [x*0.005 for x in range(0, 200)] 
y = x 

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

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

callback = CustomJS(args=dict(source=source), code=""" 
    var data = source.data; 
    var f = cb_obj.value 
    x = data['x'] 
    y = data['y'] 
    for (i = 0; i < x.length; i++) { 
     y[i] = Math.pow(x[i], f) 
    } 
    source.change.emit(); 
""") 

slider = Slider(start=0.1, end=4, value=1, step=.1, title="power") 
slider.js_on_change('value', callback) 

layout = column(slider, plot) 

show(layout) 
0

小例子,顯示什麼布賴恩回答我

from bokeh.plotting import figure 
from bokeh.models.sources import ColumnDataSource 
from bokeh.models.callbacks import CustomJS 
from bokeh.io import curdoc 
from bokeh.layouts import column 
from bokeh.models.widgets import Button 

plot = figure(
    width=600, 
    height=600, 
) 

source = ColumnDataSource({ 
    'x': [1, 2, 3], 
    'y': [4, 5, 6], 
}) 
cr = plot.circle(
    x='x', y='y', 
    source=source, size=10, color="navy", alpha=0.5 
) 

callback = CustomJS(args=dict(source=source), code=""" 
    console.log('This code will be overwritten') 
""") 
cr.glyph.js_on_change('size', callback) 

def cb(): 
    js_code = """ 
     alert('Hello!'); 
    """ 
    callback.code = js_code # update js code 
    cr.glyph.size += 1  # trigger the javascript code 

bt = Button(
    label="Start Bokeh", 
    button_type="success" 
) 
bt.on_click(cb) 

curdoc().add_root(column([bt, plot]))