2017-08-24 25 views
0

我想繪製一個可以指定範圍的正態分佈。我需要將其作爲html返回。我使用this example的一些代碼。我需要做什麼使回調工作?現在,當我在瀏覽器中查看開發人員工具時,出現list not defined錯誤。使用回調/小部件繪製正態分佈來指定範圍

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) 
+1

CustomJS代碼必須用純Javascript編寫。你已經在這裏使用了python函數,所以這就是爲什麼控制檯日誌說沒有定義列表。您可以純粹編寫python回調函數,但那些需要使用散景服務器。 – Anthonydouc

+0

好的問題似乎是[使用numpy和熊貓](https://stackoverflow.com/questions/39111369/bokeh-web-server-app-at-localhost-to-html-file/39111847#39111847)在回調函數中。鏈接示例中的'Math.sin()'函數來自javascript – 5th

+0

正確,pandas和numpy是python庫,不知道javascript。回答你自己的問題是很好的。 – Anthonydouc

回答

1

經過一番修補之後,我設法得到了我正在尋找的結果。

總結上面的討論: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'); 
""") 
+1

請注意,在最近的Bokeh版本中,這應該改爲'souce.change.emit()'(上面的語法仍然會繼續工作一段時間) – bigreddot

+0

還要注意,如果您*需要運行真正的Python代碼,這正是[Bokeh Server](https://bokeh.pydata.org/en/latest/docs/user_guide/server.html)的用途。 – bigreddot

+0

在這個任務中,我確實學到了很多關於散景的知識。想知道是否有可能將「BokehJS」與例如'jstat.js'?我試圖加載'jstat.js'到html中,希望它能與'bokeh.js'一起加載。但我找不到任何這樣做的選擇。 – 5th