私は数日間同様の問題を扱っていました。最後に私はそれを働かせました。まず、ColumnDataSource関数で角括弧[]を確認します。データは複数の画像を可能にする。したがって、コールバック関数の中では、[0]を使用して1つのイメージのデータを取得する必要があります。また、画像のソースに 'x'と 'y'を使用すると、画像x = [0]、y [0]の位置と衝突するので、xxとyyを使用しました。私はtobyhodges color_sliders.pyの例からコードを借用しました:既に定義されているコールバック関数にスライダ情報をプッシュする方法です。ここでは、コード:
import numpy as np
from bokeh.plotting import figure, show, output_file
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.io import vform
N = 100
x = np.linspace(0, 10, N)
y = np.linspace(0, 10, N)
xx, yy = np.meshgrid(x, y)
d = np.sin(xx)*np.cos(yy)
output_file("image.html", title="image.py example")
source = ColumnDataSource(data={'d': [d], 'xx': [x], 'yy': [y]})
p = figure(x_range=[0, 10], y_range=[0, 10])
p.image(image="d", x=[0], y=[0], dw=[10], dh=[10], palette="Spectral11",source=source)
callback = CustomJS(args=dict(source=source), code="""
var xx = source.get('data')['xx'][0];
var yy = source.get('data')['yy'][0];
var d = source.get('data')['d'][0];
var f = slider.get('value');
for (var i = 0; i < xx.length; i++) {
for (var j = 0; j < yy.length; j++){
d[i][j] = Math.sin(f * xx[i]) * Math.cos(yy[j]);
}
}
source.trigger('change');
""")
slider = Slider(start=0.1, end=4, value=1, step=.1, title="angular frequency", callback=callback)
callback.args['slider'] = slider
layout = vform(slider, p)
show(layout)
ボケの最新バージョンで非推奨の警告を回避するために(私がインストールされているバージョンは0.12.3です)、次のように私はこのコードを変更しました。このコードでは、イメージのデータソースは使用しません。 CustomJS
の中にイメージハンドル "im"を渡し、データソースをim.data_source
として取得します。
import numpy as np
import bokeh
import bokeh.plotting
N = 100
x = np.linspace(0, 10, N)
y = np.linspace(0, 10, N)
xx, yy = np.meshgrid(x, y)
d = np.sin(xx)*np.cos(yy)
source = bokeh.models.ColumnDataSource(data={'x': [x], 'y': [y]})
p = bokeh.plotting.figure(x_range=[0, 10], y_range=[0, 10])
im = p.image(image=[d], x=[0], y=[0], dw=[10], dh=[10], palette="Spectral11")
callback = bokeh.models.CustomJS(args=dict(source=source,im=im), code="""
var x = source.data['x'][0];
var y = source.data['y'][0];
var image_source = im.data_source;
var d = image_source.data['image'][0];
var f = slider.value;
for (var i = 0; i < x.length; i++) {
for (var j = 0; j < y.length; j++){
d[i][j] = Math.sin(f * x[i]) * Math.cos(f * y[j]);
}
}
image_source.trigger('change');
""")
slider = bokeh.models.Slider(start=0.1, end=4, value=1, step=.1,
title="angular frequency", callback=callback)
callback.args['slider'] = slider
layout = bokeh.models.layouts.Column(slider, p)
bokeh.io.output_file("image.html", title="image.py example")
bokeh.io.save(layout)
ボケバージョン0.12.4の更新:
変更:出力は今Jupyter
ノートPC用です。 htmlページを入手するには、以前のバージョンに従ってください。このbokehバージョンの新機能:JavaScript
の配列は1D配列になりました。
import numpy as np
import bokeh
import bokeh.plotting
N = 100
x = np.linspace(0, 10, N)
y = np.linspace(0, 10, N)
xx, yy = np.meshgrid(x, y)
d = np.sin(xx)*np.cos(yy)
source = bokeh.models.ColumnDataSource(data={'x': [x], 'y': [y]})
p = bokeh.plotting.figure(plot_width=300, plot_height=300,x_range=[0, 10], y_range=[0, 10])
im = p.image(image=[d], x=[0], y=[0], dw=[10], dh=[10], palette="Spectral11")
callback = bokeh.models.CustomJS(args=dict(source=source,im=im), code="""
var x = source.data['x'][0];
var y = source.data['y'][0];
var image_source = im.data_source;
var d = image_source.data['image'][0];
var f = slider.value;
for (var j = 0; j < y.length; j++){
for (var i = 0; i < x.length; i++) {
d[j*y.length + i] = Math.sin(f * x[i]) * Math.cos(f * y[j]);
}
}
image_source.trigger('change');
""")
slider = bokeh.models.Slider(start=0.1, end=4, value=1, step=.1,
title="angular frequency",callback=callback)
callback.args['slider'] = slider
layout = bokeh.models.layouts.Row(p,slider)
bokeh.io.output_notebook()
bokeh.io.show(layout)
![enter image description here](https://i.stack.imgur.com/tGOw2.png)
あなたは男です。ありがとう、友達。ほんとうにありがとう。私が作ったエラーを見て、データソースで何が起こっているのかもっとよく理解しています。 –