如何使用mpld3和flask将matplotlib图放入html容器中

时间:2014-09-08 16:05:49

标签: python matplotlib flask mpld3

我正在尝试使用mpld3-flask示例(https://github.com/nipunreddevil/mpld3-flask)作为模板来实现某种行为。我想要的是将标题栏上的链接添加到不同的图表,而不是使用单选按钮查询表单。

现在,上面的示例代码在templates / index.html中创建一个容器,然后在用户通过单击“查看绘图”按钮提交查询时用绘图填充它。就我所知,在index.html中会发生这种情况:

$("#query").click(function() {  

  $("#loading-div-background").show();
  $("#container").hide();
  var plot_type = $('input:radio[name=plot_type]:checked').val();
  var qu = {"plot_type":plot_type}
  $.ajax({
    type: "POST",
    async:true,
    contentType: "application/json; charset=utf-8",
    url: "/query",
    data: JSON.stringify(qu),
    success: function (data) {     
     var graph = $("#container");
     graph.html(data);   
     $("#loading-div-background").hide();      
     $("#container").show();
   },
   dataType: "html"
 });
});

我想要的是添加到当前包含“Home”的标题栏中,并在不同的页面中显示每个示例图。我将路由到另一个链接,然后使用绘图的数据填充模板html代码,而无需用户查询。

我对html有点新手,而且基本上对JavaScript一无所知。我的感觉在这里是有一些相对简单的方法来使用flask + jinja2来做到这一点,但我无法弄明白。

我遇到了因组合所有这些语言而产生的不清楚的命名空间的问题。在我自己的python编程中,我通常对名称空间非常严格(即我从来没有使用'来自____ import *')所以这让我有点疯狂。

1 个答案:

答案 0 :(得分:4)

工作了一段时间后,我找到了一个似乎有效的解决方案并实现了我想要的行为。请注意,我使用的是twitter bootstrap css和javascript包。

基本上,我创建一个按钮组:

  <div class="btn-group" data-toggle="buttons">
  <label class="btn btn-primary">
      <input type="radio" name="options" id="home"> Option 1
  </label>
  <label class="btn btn-primary">
      <input type="radio" name="options" id="option2"> Option 2
  </label>
  <label class="btn btn-primary">
      <input type="radio" name="options" id="option3"> Option 3
  </label>

然后在mpld3-flask示例的javascript中我使用:

$('.btn-primary').on('click', function(){
  var qu = {"plot_type":$(this).find('input').attr('id')}
  $(this).addClass('active').siblings().removeClass('active');
  $.ajax({
    type: "POST",
    async:true,
    contentType: "application/json; charset=utf-8",
    url: "/query",
    data: JSON.stringify(qu),
    success: function (data) {
     var graph = $("#container");
     graph.html(data);
     $("#container").show();
     },
   dataType: "html"
  });  
}); 

现在我有一个单选按钮栏,当前活动的绘图按钮设置为“活动”,只需要单击其中一个按钮即可绘制新的绘图。

编辑:在了解了有关flask和Jinja2的更多信息后,将mpld3生成的html传递给模板也很容易,但是有一点点问题;它看起来像这样

返回你的python路由功能:

return render_template('index.html', plot=mpld3_html)

然后在html模板中,你可以用

引用这个html

{{plot|safe}}

希望这有助于其他人。