は、現在の対話のためのさまざまな方法を混合しているが、残念ながら、あなたは常にそれぞれの異なる方法のために何かを欠場します。
使用するスライダーはbokehからのものですが、残念ながらslider.on_change
はbokehサーバーを使用している場合のみ動作します。 documentationから:
使用ボケは、ボケサーバを起動し、.on_change(またはいくつかのウィジェットのために、.on_click)にイベントハンドラを設定するのに役立ちます。
私は実際にはjupyter notebookとbokeh serverを走らせることがそれほどできませんでしたが、this issueはその可能性を議論しているようです。それはまた、bokeh.application
を言及しますが、私はそれを使用したことがないので、どのように動作するのか分かりません。
また、jupyterカーネルを呼び出してupdate_plot(value)
を実行しようとするカスタムjsコールバックを使用しますが、このような関数は決して定義されないため、何もしません。
次に、データを出力にプッシュする方法が必要です。私はbokehサーバが何とかそのようなことをすることができると思います。bokehサーバなしのjupyterノートにはpush_notebook
が解決策と思われます。プッシュするにはshow(..., notebook_handle=True)
が必要です。
ソリューション1つの利用ボケサーバー
スライダーや他の人はあなたがslider.on_change
を使用できるように自動的に、バックのpythonに自分の状態を同期ウィジェット。 CustomJSは必要ありません。あなたがでコードを実行するjupyterカーネルを使用することができます別々のプロセスを実行したくない場合は
python script -> bokeh server -> html -> userinput -> bokeh server -> python callbacks -> bokeh server updates plots
ソリューション2使用のボケスライダーが、同期がCustomJS
経由:データの流れは以下のようになりますあなたのpythonノートブック。データフロー:
jupyter notebook -> html -> user input -> customjs -> jupyter kernel -> python callbacks -> push_notebook to update plots
output_notebook()
N = 300
source = ColumnDataSource(data={'x':random(N), 'y':random(N)})
plot = figure(plot_width=950, plot_height=400)
plot.circle(x='x', y='y', source=source)
callback = CustomJS(code="""
if (IPython.notebook.kernel !== undefined) {
var kernel = IPython.notebook.kernel;
cmd = "update_plot(" + cb_obj.value + ")";
kernel.execute(cmd, {}, {})};
""")
slider = Slider(start=100, end=1000, value=N, step=10, callback=callback)
# must have the same name as the function that the CustomJS tries to call
def update_plot(N):
source.data={'x':random(N), 'y':random(N)}
# push notebooks to update plots
push_notebook()
layout = column(slider, plot)
# notebook_handle must be true, otherwise push_notebook will not work
h1 = show(layout, notebook_handle=True)
ソリューション3使用ipywidgetsあなたはjupyterノートブックでの対話のために設計されているipywidgetsを使用することができボケのウィジェットに結婚していない場合
。私はここにinteract
使用しますが、期待通りに、他のウィジェットが動作するはず
jupyter notebook -> html -> user input -> ipywidgets sync automatically -> python callbacks -> push_notebook
:データフローは以下の通りです。あなたがcondaを使用していない場合jupyter nbextension enable --py --sys-prefix widgetsnbextension
を呼び出すinlcudesあなたが適切ipywidgetsをインストールする必要が
from ipywidgets import interact
output_notebook()
N = 300
source = ColumnDataSource(data={'x':random(N), 'y':random(N)})
plot = figure(plot_width=950, plot_height=400)
plot.circle(x='x', y='y', source=source)
def update_plot(v):
N = v
print(N)
source.data={'x':random(N), 'y':random(N)}
# push changed plots to the frontend
push_notebook()
# notebook_handle must be true so that push_notebook works
show(plot, notebook_handle=True)
注意、。詳細はsee the documentation
あなたは[this](https://bokeh.pydata.org/en/latest/docs/user_guide/notebook.html#jupyter-interactors)ガイドを見ましたか?あなたは重要な 'push_notebook'を見逃しています。 – syntonym
返信いただきありがとうございます!私はJupyter内でこのコードを実行しており、完全に動作します。しかし、私のコードにpush_notebookを追加しても何も変わりません。あなたのマシンでこれを実行しましたか? – AdrianC
私は 'show'関数に' notebook_handle = True'も必要と思います。現在、私はあなたのコードを実行することはできませんが、誰もあなたを助けることができなければ、私は今晩見ていきます。たぶんあなたがもっと早くあなたを助けるかもしれない例を実行している輸入などを追加する場合。カスタムjsコールバックをやっている理由は分かりません。おそらくウェッジの例からですか?私は 'plot.circle'ではそれは必要ないと思っていますが、私は今晩しかテストできません。 – syntonym