利用 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 相关文章推荐
Python3实现生成随机密码的方法
Aug 23 Python
Python对象体系深入分析
Oct 28 Python
Python的设计模式编程入门指南
Apr 02 Python
基于python实现微信模板消息
Dec 21 Python
Python+Wordpress制作小说站
Apr 14 Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 Python
解决Python网页爬虫之中文乱码问题
May 11 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
Apr 11 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
Python使用Pandas库常见操作详解
Jan 16 Python
Python中Qslider控件实操详解
Feb 20 Python
python办公自动化之excel的操作
May 23 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
PHP的FTP学习(一)[转自奥索]
2006/10/09 PHP
php 批量替换程序的具体实现代码
2013/10/04 PHP
PHP header()函数常用方法总结
2014/04/11 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
javascript中的document.open()方法使用介绍
2013/10/09 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
简单实现AngularJS轮播图效果
2020/04/10 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
vue.js,ajax渲染页面的实例
2018/02/11 Javascript
vue获取当前激活路由的方法
2018/03/17 Javascript
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
Windows下Python的Django框架环境部署及应用编写入门
2016/03/10 Python
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
tensorflow 实现自定义layer并添加到计算图中
2020/02/04 Python
使用python matplotlib 画图导入到word中如何保证分辨率
2020/04/16 Python
Python如何创建装饰器时保留函数元信息
2020/08/07 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
解锁canvas导出图片跨域的N种姿势小结
2019/01/24 HTML / CSS
试用期转正鉴定评语
2014/01/27 职场文书
高中生期末评语大全
2014/01/28 职场文书
物理教育专业求职信
2014/06/25 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
司法局2014法制宣传日活动总结
2014/11/01 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
实习报告范文
2019/07/30 职场文书
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python