在 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