簡體   English   中英

如何使用Bokeh從Python調用JavaScript函數?

[英]How can I call a JavaScript function from Python using Bokeh?

我有這種情況:

  1. 我有一些數據(在pandas數據框中)用於繪制圖
  2. 當我按下一個按鈕(由bokeh小部件構建)時,我可以調用回調方法,並使用python進行計算。
  3. 但是現在我想將計算的數據發送回用戶,以便在向導中顯示問題。 所以我需要運行一些JavaScript函數。

我正在考慮創建一個虛擬按鈕並從python運行此按鈕的click方法。 但是我認為這是不可能的。

那么,如何直接從python運行JavaScript函數?

從Bokeh 0.12.6 ,能夠進行此類“遠程過程調用”仍然是一項開放功能要求

同時,最好的選擇是將CustomJS回調添加到某些模型的某些屬性。 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)

最小的例子顯示布萊恩回答了我

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM