【问题标题】:Bokeh, Django - embedding more independent plots via ComponentsBokeh, Django - 通过组件嵌入更多独立的图
【发布时间】:2019-07-11 01:31:10
【问题描述】:

我有带有用于嵌入的散景图组件对的数据库 - 脚本和 Div HTML 元素。我想在单页上嵌入更多独立的散景图。下面的模板代码为每次迭代呈现相同的第一个图,请告知我做错了什么..

PS:我知道要嵌入多个图,您可以为所有图导出单个脚本,并为每个图导出唯一的 Div。这对我不起作用,因为每个情节将在不同的时间生成(更新)。

感谢您的帮助!

{% for plot in plots %}
  <div>
    {{ plot.plot_div | safe }}
    {{ plot.plot_script | safe }}
  </div>
{% endfor %}

【问题讨论】:

    标签: python django bokeh


    【解决方案1】:

    在这种情况下,您可能应该使用最近添加的json_item 进行嵌入。此函数生成它所传递的任何内容的 JSON 表示,可以使用对模板中 Bokeh.embed.embed_items 的 JavaScript 调用单独嵌入。

    这是一个基于 Flask 的完整示例,但想法应该直接转移到 Django:

    from __future__ import print_function
    import json
    
    from bokeh.embed import json_item
    from bokeh.plotting import figure
    from bokeh.resources import CDN
    from bokeh.sampledata.iris import flowers
    
    from flask import Flask
    from jinja2 import Template
    
    app = Flask(__name__)
    
    page = Template("""
    <!DOCTYPE html>
    <html lang="en">
    <head>
      {{ resources }}
    </head>
    <body>
      <div id="myplot"></div>
      <div id="myplot2"></div>
      <script>
      fetch('/plot')
        .then(function(response) { return response.json(); })
        .then(function(item) { Bokeh.embed.embed_item(item); })
      </script>
      <script>
      fetch('/plot2')
        .then(function(response) { return response.json(); })
        .then(function(item) { Bokeh.embed.embed_item(item, "myplot2"); })
      </script>
    </body>
    """)
    
    colormap = {'setosa': 'red', 'versicolor': 'green', 'virginica': 'blue'}
    colors = [colormap[x] for x in flowers['species']]
    
    def make_plot(x, y):
        p = figure(title = "Iris Morphology", sizing_mode="fixed", plot_width=400, plot_height=400)
        p.xaxis.axis_label = x
        p.yaxis.axis_label = y
        p.circle(flowers[x], flowers[y], color=colors, fill_alpha=0.2, size=10)
        return p
    
    @app.route('/')
    def root():
        return page.render(resources=CDN.render())
    
    @app.route('/plot')
    def plot():
        p = make_plot('petal_width', 'petal_length')
        return json.dumps(json_item(p, "myplot"))
    
    @app.route('/plot2')
    def plot2():
        p = make_plot('sepal_width', 'sepal_length')
        return json.dumps(json_item(p))
    
    if __name__ == '__main__':
        app.run()
    

    【讨论】:

      猜你喜欢
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      相关资源
      最近更新 更多