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

Posted

技术标签:

【中文标题】在 django 中使用交互式控件制作散景图【英文标题】:Make bokeh charts with interactive controls in django 【发布时间】:2015-10-13 15:57:51 【问题描述】:

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

现在我通过使用bokeh.embed.components 函数和如下模板得到:

<body>
    the_div|safe

    the_script|safe
</body>

感谢this *** question。

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

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

    我不知道如何在 Django 中嵌入这种对象。我会说this 是要走的路,但也许不是。 我对必须为此使用散景服务器感到有些困惑。没有好用的纯javascript解决方案吗?

所以,总而言之,我想知道使用 django 和 bokeh 创建动态图表交互的标准方法是什么。

【问题讨论】:

纯javascript图表解决方案?像 d3.js 之类的东西? 我希望散景能够在更高级别从我的 python 代码创建 .js。它已经在我的“更静态”图表中表现得很好。 另一种方法是使用BokehJS 并在客户端中执行所有操作(只需使用 json 传递您的数据)。文档仍在编写中,目前还不是很容易使用,但simple examples 很容易找到。 你为什么不用bokeh.pydata.org/en/latest/docs/user_guide/… 【参考方案1】:

有两个用例:


无服务器

如果您可以在 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.bokeh.org/

以及此处文档中有关各种部署的大量文档:

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

【讨论】:

看起来CustomJS 是我正在寻找的东西,但在我看来,它是在我提出问题后添加的。仅出于完整性考虑,它从哪个版本可用? 早期版本出现在0.9,但当前版本出现在0.10之后 对不起,我知道这是一个老问题。 @bigreddot 您是否希望没有服务器的代码对组件有价值?我在 Django 中运行了这段代码,但无法进行交互。 是的,一般来说,但是自发布此答案以来,JS API 发生了一些变化,例如不再有trigger 方法,这可能是任何问题的根源。这里有很多展示稳定 1.0+ 语法的 JS 回调示例:bokeh.pydata.org/en/latest/docs/user_guide/interaction/…

以上是关于在 django 中使用交互式控件制作散景图的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Django 上传按钮旁边嵌入散景图时出现 ImportError

csv上传后,散景图不会出现在同一个django页面上

Zeppelin 的内联散景图

嵌入式散景数据表未在 Django 中显示

Bokeh & Django: RuntimeError("模型必须只属于一个文档")

在Flask中嵌入散景图