在django中使用交互式控件制作散景图

时间:2015-07-23 11:16:59

标签: python django dynamic embed bokeh

我有一个django应用程序,最终使用嵌入式散景可视化。

现在我可以使用bokeh.embed.components函数和类似的模板:

<body>
    {{the_div|safe}}

    {{the_script|safe}}
</body>

感谢this stackoverflow question

问题是,现在我需要创建更多交互式可视化,添加滑块,复选框和其他控件。

This example看起来像我想要的,除了几个问题:

  1. 我不知道如何在Django中嵌入那种对象。我会说this是要走的路,但也许不是。
  2. 我对为此必须使用散景服务器感到有些困惑。是不是有任何易于使用的纯JavaScript解决方案?
  3. 总而言之,我想知道使用django和bokeh创建动态图表交互的标准方法是什么。

1 个答案:

答案 0 :(得分:2)

有两种用例:

没有服务器

如果你可以在JS中执行任何更新(不需要调用实际的python代码),那么使用CustomJS callbacks添加交互非常容易。该链接有很多示例,但基本的简单代码示例如下:

from bokeh.io import vform
from bokeh.models import CustomJS, ColumnDataSource, Slider
from bokeh.plotting import Figure, output_file, show

output_file("callback.html")

x = [x*0.005 for x in range(0, 200)]
y = x

source = ColumnDataSource(data=dict(x=x, y=y))

plot = Figure(plot_width=400, plot_height=400)
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)

callback = CustomJS(args=dict(source=source), code="""
    var data = source.get('data');
    var f = cb_obj.get('value')
    x = data['x']
    y = data['y']
    for (i = 0; i < x.length; i++) {
        y[i] = Math.pow(x[i], f)
    }
    source.trigger('change');
""")

slider = Slider(start=0.1, end=4, value=1, step=.1, 
                title="power", callback=callback)

layout = vform(slider, plot)

show(layout)

这将创建一个带有散景图和滑块的独立HTML文档,它会更新绘图以响应滑块,而不需要服务器(即您可以通过电子邮件发送给某人或在静态页面上提供服务)它会起作用。)

与服务器

如果您想要小部件,交互等来驱动实际的python代码(例如scikit-learn或Pandas),那么您需要使用Bokeh服务器。令人高兴的是,版本0.11的新服务器更加强大,高性能,可扩展且易于使用。您可以在此处看到几个实时部署的Bokeh应用程序(包含其源代码的链接):

http://demo.bokehplots.com/

除了文档中有关各种部署的大量文档外:

http://bokeh.pydata.org/en/0.11.1/docs/user_guide/server.html