散景中的两个微调器不交互
Two spinners in bokeh don't interact
我正在尝试在 Bokeh 中制作交互式正态分布,您可以在其中操纵 mu 和 sigma 的值以查看图形受到的影响。
我的两个微调器独立工作都很好,但改变一个会重置另一个。有人可以指出我做错了什么吗?
我不是特别擅长javascript。我最初尝试只使用 Python 来制作这个交互式情节,并且成功了。问题是它需要在我的终端中使用 bokeh serve ...
通过散景 运行 打开。
我重写了代码以使用 JS 回调,以便我可以将其保存为独立的 html 文件,但现在我 运行 正在处理连接所有部分的问题。
如有任何帮助,我们将不胜感激。代码贴在下面。
import numpy as np
from scipy.stats import norm
from bokeh.io import curdoc
from bokeh.layouts import column, row
from bokeh.models import ColumnDataSource, Spinner, Slider, TextInput, CustomJS
from bokeh.plotting import figure, show, output_file, save
# Set up data
sig = .5
mu = .1
x = np.arange(-3, 3, 0.001)
y = norm.pdf(x, mu, sig)
source = ColumnDataSource(data=dict(x=x, y=y))
# Set up plot
plot = figure(height=400, width=400, title="Normal Distribution",
tools="crosshair,pan,reset,save,wheel_zoom",
x_range=[-2, 2], y_range=[0, 1])
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)
callbackmu = CustomJS(args=dict(source=source, sig2=sig2), code="""
var data = source.data;
var input = cb_obj.value;
var s = sig2.value;
function fff (x, mu, sigma) {
var num = Math.exp(-Math.pow((x - mu), 2) / (2 * Math.pow(sigma, 2)))
var denom = sigma * Math.sqrt(2 * Math.PI)
return num / denom
};
var a = input;
var x = data['x'];
var y = data['y'];
for (var i = 0; i < x.length; i++) {
y[i] = fff (x[i], a, s);
}
source.change.emit();
""")
callbacksig = CustomJS(args=dict(source=source, mu2=mu2), code="""
var data = source.data;
var input = cb_obj.value;
var m = mu2.value;
console.log(mu2)
function fff (x, mu, sigma) {
var num = Math.exp(-Math.pow((x - mu), 2) / (2 * Math.pow(sigma, 2)))
var denom = sigma * Math.sqrt(2 * Math.PI)
return num / denom
};
var a = input;
var x = data['x'];
var y = data['y'];
for (var i = 0; i < x.length; i++) {
y[i] = fff (x[i], m, a);
}
source.change.emit();
""")
mu2 = Spinner(title="mu", value=mu, low=-2.0, high=2.0, step=0.1)
mu2.js_on_change('value', callbackmu)
sig2 = Spinner(title='sig', value=sig, low=.01, high=1, step=.01)
sig2.js_on_change('value', callbacksig)
layout = column(mu2, sig2, plot)
show(layout)
我是个笨蛋。
我将微调器分配放在回调分配之前,现在一切正常。
我正在尝试在 Bokeh 中制作交互式正态分布,您可以在其中操纵 mu 和 sigma 的值以查看图形受到的影响。
我的两个微调器独立工作都很好,但改变一个会重置另一个。有人可以指出我做错了什么吗?
我不是特别擅长javascript。我最初尝试只使用 Python 来制作这个交互式情节,并且成功了。问题是它需要在我的终端中使用 bokeh serve ...
通过散景 运行 打开。
我重写了代码以使用 JS 回调,以便我可以将其保存为独立的 html 文件,但现在我 运行 正在处理连接所有部分的问题。
如有任何帮助,我们将不胜感激。代码贴在下面。
import numpy as np
from scipy.stats import norm
from bokeh.io import curdoc
from bokeh.layouts import column, row
from bokeh.models import ColumnDataSource, Spinner, Slider, TextInput, CustomJS
from bokeh.plotting import figure, show, output_file, save
# Set up data
sig = .5
mu = .1
x = np.arange(-3, 3, 0.001)
y = norm.pdf(x, mu, sig)
source = ColumnDataSource(data=dict(x=x, y=y))
# Set up plot
plot = figure(height=400, width=400, title="Normal Distribution",
tools="crosshair,pan,reset,save,wheel_zoom",
x_range=[-2, 2], y_range=[0, 1])
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)
callbackmu = CustomJS(args=dict(source=source, sig2=sig2), code="""
var data = source.data;
var input = cb_obj.value;
var s = sig2.value;
function fff (x, mu, sigma) {
var num = Math.exp(-Math.pow((x - mu), 2) / (2 * Math.pow(sigma, 2)))
var denom = sigma * Math.sqrt(2 * Math.PI)
return num / denom
};
var a = input;
var x = data['x'];
var y = data['y'];
for (var i = 0; i < x.length; i++) {
y[i] = fff (x[i], a, s);
}
source.change.emit();
""")
callbacksig = CustomJS(args=dict(source=source, mu2=mu2), code="""
var data = source.data;
var input = cb_obj.value;
var m = mu2.value;
console.log(mu2)
function fff (x, mu, sigma) {
var num = Math.exp(-Math.pow((x - mu), 2) / (2 * Math.pow(sigma, 2)))
var denom = sigma * Math.sqrt(2 * Math.PI)
return num / denom
};
var a = input;
var x = data['x'];
var y = data['y'];
for (var i = 0; i < x.length; i++) {
y[i] = fff (x[i], m, a);
}
source.change.emit();
""")
mu2 = Spinner(title="mu", value=mu, low=-2.0, high=2.0, step=0.1)
mu2.js_on_change('value', callbackmu)
sig2 = Spinner(title='sig', value=sig, low=.01, high=1, step=.01)
sig2.js_on_change('value', callbacksig)
layout = column(mu2, sig2, plot)
show(layout)
我是个笨蛋。
我将微调器分配放在回调分配之前,现在一切正常。