在bokeh中嵌入散景应用程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在bokeh中嵌入散景应用程序相关的知识,希望对你有一定的参考价值。

我正在拼命地将一个正在运行的散景小程序嵌入到烧瓶中,并且找不到合适的方法来执行此操作。我查看了所有示例,但我找不到一个包含更新数据的能力(最好的例子:sliders_applet)。

如果我没弄错的话,我确实需要散景服务器才能更改数据(使用滑块等)。以这种方式启动applet,例如:

bokeh-server --script sliders_app.py

但我找不到合适的,或者至少是一种将sliders_app嵌入烧瓶的工作方式。由于应该可以使用多个applet,因此在散景服务器启动时指定一个小程序似乎并不干净。

我很乐意感谢任何帮助 - 散景看起来对我来说是一个很棒的工具。

答案

由Bokeh项目的核心开发人员之一编辑以下信息不能回答上述问题。如下所述,使用bokeh.embed.components嵌入Bokeh应用程序是绝对不可能的。 components只能嵌入独立的文档(即不在Bokeh服务器上运行)


example of embedding bokeh with flask上有一个the bokeh github repo

import flask

from bokeh.embed import components
from bokeh.plotting import figure
from bokeh.resources import INLINE
from bokeh.templates import RESOURCES
from bokeh.util.string import encode_utf8

app = flask.Flask(__name__)

colors = {
    'Black': '#000000',
    'Red':   '#FF0000',
    'Green': '#00FF00',
    'Blue':  '#0000FF',
}


def getitem(obj, item, default):
    if item not in obj:
        return default
    else:
        return obj[item]


@app.route("/")
def polynomial():
    """ Very simple embedding of a polynomial chart"""
    # Grab the inputs arguments from the URL
    # This is automated by the button
    args = flask.request.args

    # Get all the form arguments in the url with defaults
    color = colors[getitem(args, 'color', 'Black')]
    _from = int(getitem(args, '_from', 0))
    to = int(getitem(args, 'to', 10))

    # Create a polynomial line graph
    x = list(range(_from, to + 1))
    fig = figure(title="Polynomial")
    fig.line(x, [i ** 2 for i in x], color=color, line_width=2)

    # Configure resources to include BokehJS inline in the document.
    # For more details see:
    #   http://bokeh.pydata.org/en/latest/docs/reference/resources_embedding.html#module-bokeh.resources
    plot_resources = RESOURCES.render(
        js_raw=INLINE.js_raw,
        css_raw=INLINE.css_raw,
        js_files=INLINE.js_files,
        css_files=INLINE.css_files,
    )

    # For more details see:
    #   http://bokeh.pydata.org/en/latest/docs/user_guide/embedding.html#components
    script, div = components(fig, INLINE)
    html = flask.render_template(
        'embed.html',
        plot_script=script, plot_div=div, plot_resources=plot_resources,
        color=color, _from=_from, to=to
    )
    return encode_utf8(html)


def main():
    app.debug = True
    app.run()

if __name__ == "__main__":
    main()

另一个想法是并排运行bokeh-server和你的flask网络应用程序,并以这种方式加载散景代码(服务器端或通过JS或iframe),但这可能很麻烦。

另一答案

另一个答案没有描述如何嵌入Bokeh服务器应用程序(它使用components嵌入一个独立的Bokeh文档)。

首先,您可以看到许多现场示例:https://demo.bokeh.org/

对于嵌入应用程序,有两种常用选项:

后者通常使用如下:

script = autoload_server(model=None,
                         app_path="/apps/slider",
                         url="https://demo.bokehplots.com")

这将返回一个与下面类似的<script>标记,您可以将其放入烧瓶HTML响应中,无论您希望应用出现在何处:

<script
    src="https://demo.bokehplots.com/apps/slider/autoload.js?bokeh-autoload-element=c5c9bdb5-40e8-46a2-9bf0-40a9d396ce97"
    id="c5c9bdb5-40e8-46a2-9bf0-40a9d396ce97"
    data-bokeh-model-id=""
    data-bokeh-doc-id=""
></script>

最后,值得注意的是,默认情况下,Bokeh服务器选择相当保守的网络配置。您需要启动Bokeh服务器,并将--allow-websocket-origin命令行选项设置为您将散景应用程序嵌入到的任何主机。

以上是关于在bokeh中嵌入散景应用程序的主要内容,如果未能解决你的问题,请参考以下文章

散景内联嵌入,“加载资源失败”

无法将散景图嵌入到 Flask 应用程序中

使用 Django 模型嵌入散景[重复]

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

Django:Bokeh.safely 不是一个函数

未使用下拉菜单选择更新散景图