利用 Flask 动态展示 Pyecharts 图表数据方法小结


Posted in Python onSeptember 04, 2019

本文将介绍如何在 web 框架 Flask 中使用可视化工具 pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法,不会的话你来找我呀...

Flask 模板渲染

1. 新建一个项目 flask-echarts

在编辑器中选择 New Project,然后选择 Flask,创建完之后,Pycharm 会帮我们把启动脚本和模板文件夹都建好

利用 Flask 动态展示 Pyecharts 图表数据方法小结

利用 Flask 动态展示 Pyecharts 图表数据方法小结

2. 拷贝 pyecharts 模板

将链接中的以下模板 ├── jupyter_lab.html ├── jupyter_notebook.html ├── macro ├── nteract.html ├── simple_chart.html ├── simple_page.html └── table.html 全部拷贝到 tempaltes 文件夹中 github.com/pyecharts/p…

3.渲染图表

主要目标是将 pyecharts 生成的图表数据在视图函数中返回,所以我们直接在 app.py 中修改代码,如下:

from flask import Flask
from jinja2 import Markup
from pyecharts import options as opts
from pyecharts.charts import Bar
app = Flask(__name__, static_folder="templates")
def bar_base() -> Bar:
  c = (
    Bar()
      .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
      .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
      .add_yaxis("商家B", [15, 25, 16, 55, 48, 8])
      .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
  )
  return c
@app.route("/")
def index():
  c = bar_base()
  return Markup(c.render_embed())
if __name__ == "__main__":
  app.run()

直接运行,在浏览器中输入地址,直接将数据显示出来了

利用 Flask 动态展示 Pyecharts 图表数据方法小结 

这是一个很简单的静态数据展示,别急好戏还在后头~

Flask 前后端分离

前面讲的是一个静态数据的展示的方法,用 pyecharts 和 Flask 结合最主要是实现一种动态更新数据,增量更新数据等功能!以上面讲解的内容为基础,在 templates 文件夹中新建一个 index.html 的文件,其中主要用到了 jquery 和 pyecharts 管理的 echarts.min.js 依赖。

index.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>动态更新数据</title>
  <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
  <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
</head>
<body>
  <div id="bar" style="width:1000px; height:600px;"></div>
  <script>
   (
    function () {
      var result_json = '{{ result_json|tojson }}';
      // var result = JSON.parse(result_json);
      var chart = echarts.init(document.getElementById('bar'), 'gray', {renderer: 'canvas'});
      $.ajax({
        type: "GET",
        url: "http://127.0.0.1:5000/barChart",
        dataType: 'json',
        data: {result: result_json},
        success: function (result) {
          chart.setOption(result);
        }
      });
    }
  )
  </script>
</body>
</html>

有 html 基础的朋友应该知道该代码主要是向地址 "127.0.0.1:5000/barChart" 发送请求,所以在 app.py 中我们也需要做相应的修改,添加该地址的路由函数,从而实现动态数据更新。 部分代码如下:

@app.route("/")
def index():
  data = request.args.to_dict()
  return render_template("index.html", result_json=data)
@app.route("/barChart")
def get_bar_chart():
  args = request.args.to_dict()
  result = eval(args.get("result"))
  name = result.get("name")
  subtitle = result.get("subtitle")
  c = bar_base(name, subtitle)
  return c.dump_options_with_quotes()

在 index 视图函数中接收浏览器传过来的参数,然后传递给 index.html。此处只是简单示例,所以未做参数校验。而另一个视图函数主要是获取参数,传给图表生成函数 bar_base(), 从而实现根据 url 地址传过来的参数,动态展示图表数据。结果如下:

利用 Flask 动态展示 Pyecharts 图表数据方法小结 

这里只是简单演示, 所以只将图表标题作为动态传参。此场景适用于第一次请求获取我们想要的数据,然后将其展示出来。比如我之前写的 NBA 球员数据可视化  mp.weixin.qq.com/s/WWCNf46Ch…

就是此方法,不同球员展示对应球员数据!

定时全量更新图表

该场景主要是前端主动向后端进行数据刷新,定时刷新的核心在于 HTML 的 setInterval 方法。那么 index.html 代码就是下面这样的:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Awesome-pyecharts</title>
  <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
  <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
</head>
<body>
  <div id="bar" style="width:1000px; height:600px;"></div>
  <script>
    var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
    $(
      function () {
        fetchData(chart);
        setInterval(fetchData, 2000);
      }
    );
    function fetchData() {
      $.ajax({
        type: "GET",
        url: "http://127.0.0.1:5000/barChart",
        dataType: 'json',
        success: function (result) {
          chart.setOption(result);
        }
      });
    }
  </script>
</body>
</html>

对应的将 app.py 中 bar_base() 作相应的修改,从而实现定时全量更新图表

def bar_base() -> Bar:
  c = (
    Bar()
      .add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
      .add_yaxis("商家A", [random.randint(10, 100) for _ in range(6)])
      .add_yaxis("商家B", [random.randint(10, 100) for _ in range(6)])
      .set_global_opts(title_opts=opts.TitleOpts(title="", subtitle=""))
  )
  return c
@app.route("/")
def index():
  return render_template("index.html")
@app.route("/barChart")
def get_bar_chart():
  c = bar_base()
  return c.dump_options_with_quotes()

运行之后,在浏览器中打开,效果如下:

利用 Flask 动态展示 Pyecharts 图表数据方法小结 

看到这动图,有没有一种...,如果我是 DJ DJ,琦你太美...

定时增量更新图表

同样的要对 index.html 做修改

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Awesome-pyecharts</title>
  <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
  <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
</head>
<body>
  <div id="bar" style="width:1000px; height:600px;"></div>
  <script>
    var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
    var old_data = [];
    $(
      function () {
        fetchData(chart);
        setInterval(getDynamicData, 2000);
      }
    );
    function fetchData() {
      $.ajax({
        type: "GET",
        url: "http://127.0.0.1:5000/lineChart",
        dataType: "json",
        success: function (result) {
          chart.setOption(result);
          old_data = chart.getOption().series[0].data;
        }
      });
    }
    function getDynamicData() {
      $.ajax({
        type: "GET",
        url: "http://127.0.0.1:5000/lineDynamicData",
        dataType: "json",
        success: function (result) {
          old_data.push([result.name, result.value]);
          chart.setOption({
            series: [{data: old_data}]
          });
        }
      });
    }
  </script>
</body>
</html>

增量更新,后端代码也需要相应的修改

from pyecharts.charts import Line
def line_base() -> Line:
  line = (
    Line()
    .add_xaxis(["{}".format(i) for i in range(10)])
    .add_yaxis(
      series_name="",
      y_axis=[randrange(50, 80) for _ in range(10)],
      is_smooth=True,
      label_opts=opts.LabelOpts(is_show=False),
    )
    .set_global_opts(
      title_opts=opts.TitleOpts(title="动态数据"),
      xaxis_opts=opts.AxisOpts(type_="value"),
      yaxis_opts=opts.AxisOpts(type_="value"),
    )
  )
  return line
@app.route("/")
def index():
  return render_template("index.html")
@app.route("/lineChart")
def get_line_chart():
  c = line_base()
  return c.dump_options_with_quotes()
idx = 9
@app.route("/lineDynamicData")
def update_line_data():
  global idx
  idx = idx + 1
  return jsonify({"name": idx, "value": randrange(50, 80)})

走起,来看看效果吧

利用 Flask 动态展示 Pyecharts 图表数据方法小结 

总结

以上所述是小编给大家介绍的利用 Flask 动态展示 Pyecharts 图表数据方法小结,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
从零学Python之入门(四)运算
May 27 Python
Linux中安装Python的交互式解释器IPython的教程
Jun 13 Python
基于python元祖与字典与集合的粗浅认识
Aug 23 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
python验证身份证信息实例代码
May 06 Python
Python 的AES加密与解密实现
Jul 09 Python
对python while循环和双重循环的实例详解
Aug 23 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
Python调用接口合并Excel表代码实例
Mar 31 Python
python实现简单学生信息管理系统
Apr 09 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
解决python3.x安装numpy成功但import出错的问题
Nov 17 Python
python3实现微型的web服务器
Sep 03 #Python
Python面向对象之Web静态服务器
Sep 03 #Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 #Python
Django中间件拦截未登录url实例详解
Sep 03 #Python
如何为Python终端提供持久性历史记录
Sep 03 #Python
Python openpyxl读取单元格字体颜色过程解析
Sep 03 #Python
python xlwt如何设置单元格的自定义背景颜色
Sep 03 #Python
You might like
BBS(php &amp; mysql)完整版(八)
2006/10/09 PHP
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
PHP获取数组中重复最多的元素的实现方法
2014/11/11 PHP
php 多文件上传的实现实例
2016/10/23 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
Tab页界面,用jQuery及Ajax技术实现
2009/09/21 Javascript
javascript上传图片前预览图片兼容大多数浏览器
2013/10/25 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
微信小程序获取用户openId的实现方法
2017/05/23 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
2017/06/12 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
全面了解JavaScript的作用域链
2019/04/03 Javascript
JS工厂模式开发实践案例分析
2019/10/17 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
用Python脚本来删除指定容量以上的文件的教程
2015/05/04 Python
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
使用Python Pandas处理亿级数据的方法
2019/06/24 Python
Python列表与元组的异同详解
2019/07/02 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
写演讲稿要注意的六件事
2014/01/14 职场文书
争论的故事教学反思
2014/02/06 职场文书
初一学生评语大全
2014/04/24 职场文书
教师批评与自我批评
2014/10/15 职场文书
高二化学教学反思
2016/02/22 职场文书
创业计划书之干洗店
2019/09/10 职场文书
Go语言基础map用法及示例详解
2021/11/17 Golang
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python