Javascript 使用回调/小部件绘制正态分布以指定范围

Javascript 使用回调/小部件绘制正态分布以指定范围,javascript,python,bokeh,Javascript,Python,Bokeh,我试着画一个正态分布,你可以指定范围。我需要返回这个作为html。我使用了来自的一些代码。我需要做什么才能使回调正常工作?现在,当我在浏览器中检查开发人员工具时,我发现列表未定义为错误 import numpy as np import scipy.stats from bokeh.layouts import column from bokeh.models import CustomJS, Slider from bokeh.plotting import figure, output_f

我试着画一个正态分布,你可以指定范围。我需要返回这个作为html。我使用了来自的一些代码。我需要做什么才能使回调正常工作?现在,当我在浏览器中检查开发人员工具时,我发现
列表未定义为错误

import numpy as np
import scipy.stats

from bokeh.layouts import column
from bokeh.models import CustomJS, Slider
from bokeh.plotting import figure, output_file, show, ColumnDataSource

output_file("slider2.html")
N = 500;a = 0;b = 1
x = list(np.linspace(a, b, N))
z = list(scipy.stats.norm.pdf(x,abs(b-a)/2,abs(b-a)/6))
source = ColumnDataSource(data=dict(x=x,z=z))

plot = figure(plot_width=400, plot_height=400)
plot.line('x', 'z', source=source, line_width=2, line_alpha=0.3)

callback = CustomJS(args=dict(source=source), code="""
    var d2 = source.get('data');
    var b = cb_obj.get('value')
    d2['x'] = list(np.linspace(a, b, N))
    d2['z'] = scipy.stats.norm.pdf(x,abs(b-a)/2,abs(b-a)/6);
    source.change.emit();
""")

slider = Slider(start=1, end=10, value=1, step=.1, title="upper limit", callback=callback)
layout = column(slider, plot)
show(layout)

经过一番修补,我终于得到了我想要的结果


总结以上讨论:CustomJS代码必须用纯Javascript编写。因此,使用任何python函数都会导致html文件中出现错误。但是,可以使用Javascript函数

callback = CustomJS(args=dict(source=source), code="""
   var d2 = source.get('data');
   var b = cb_obj.get('value')
   for (i = 0; i < 1000; i++) {
      x[i]=Math.random()*b
   }
   x.sort(function(a, b){return a - b})
   source.data['x']=x
   z=d2['z']  
   var first=(1/Math.sqrt(2*Math.PI*Math.pow(b/6,2)))
   for (i = 0; i < x.length; i++) {
      z[i] = first*(Math.exp(-Math.pow((x[i]-(b/2))/(b/6),2)));
   }
   source.trigger('change');
""")
callback=CustomJS(args=dict(source=source),code=”“”
var d2=source.get('data');
var b=cb_obj.get('值')
对于(i=0;i<1000;i++){
x[i]=Math.random()*b
}
x、 排序(函数(a,b){返回a-b})
source.data['x']=x
z=d2['z']
var first=(1/Math.sqrt(2*Math.PI*Math.pow(b/6,2)))
对于(i=0;i
CustomJS代码必须用纯Javascript编写。您在这里使用了python函数,因此控制台日志显示列表未定义。您可以编写纯粹的python回调,但是这些回调需要使用bokeh服务器。链接示例中的
Math.sin()
-函数来自javascriptCorrect,pandas和numpy是python库,javascript不知道。回答您自己的问题很好。请注意,在Bokeh的最新版本中,这应该更改为
souce.change.emit()
(上面的语法仍将继续工作一段时间)还请注意,如果您确实需要运行真正的Python代码,这正是它的用途。在这项任务中,我确实学到了很多关于Bokeh的知识。只是想知道有没有可能将
BokehJS
与例如
jstat.js
相结合?我试图以某种方式将
jstat.js
加载到html中,希望它能与
bokeh.js
一起加载。但是我找不到任何选项可以做到这一点。
CustomJS
回调只执行JS代码,所以原则上看起来是可能的,但我对
jstat.JS
一无所知,所以可能会有一些微妙的细节。很抱歉,我无法提供更多帮助。没问题。但是在“bokeh”中没有(简单的)可选语句可以让您在执行“CustomJS”之前加载“.js”库?在我失败的试验中,我将bokeh提供的
包含在
文件\u html
-函数的html模板中。虽然简而言之,这不起作用,因为
文件中的
模板
-选项(可能)用于其他内容,或者被称为“太晚”。