【发布时间】:2021-08-12 08:48:31
【问题描述】:
我正在尝试在 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)
【问题讨论】:
标签: javascript python bokeh