当前位置:   article > 正文

干货!Flask 动态展示 Pyecharts 图表数据的几种方法!

flask pyecharts

c23184546070dd171566fbc9c32e6300.png

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

Flask 模板渲染

1. 新建一个项目flask_pyecharts

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

964ac142c8f379f2f22863b9db52434f.png 7bea48825ed040bd061c55f1f41431aa.png
2. 拷贝 pyecharts 模板

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

3.渲染图表

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

  1. from flask import Flask
  2. from jinja2 import Markup
  3. from pyecharts import options as opts
  4. from pyecharts.charts import Bar
  5. app = Flask(__name__, static_folder="templates")
  6. def bar_base() -> Bar:
  7.     c = (
  8.         Bar()
  9.             .add_xaxis(["衬衫""羊毛衫""雪纺衫""裤子""高跟鞋""袜子"])
  10.             .add_yaxis("商家A", [52036107590])
  11.             .add_yaxis("商家B", [15251655488])
  12.             .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题"))
  13.     )
  14.     return c
  15. @app.route("/")
  16. def index():
  17.     c = bar_base()
  18.     return Markup(c.render_embed())
  19. if __name__ == "__main__":
  20.     app.run()

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

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

Flask 前后端分离

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

index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>动态更新数据</title>
  6.     <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
  7.     <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
  8. </head>
  9. <body>
  10.     <div id="bar" style="width:1000px; height:600px;"></div>
  11.     <script>
  12.       (
  13.         function () {
  14.             var result_json = '{{ result_json|tojson }}';
  15.             // var result = JSON.parse(result_json);
  16.             var chart = echarts.init(document.getElementById('bar'), 'gray', {renderer: 'canvas'});
  17.             $.ajax({
  18.                 type"GET",
  19.                 url: "http://127.0.0.1:5000/barChart",
  20.                 dataType: 'json',
  21.                 data: {result: result_json},
  22.                 success: function (result) {
  23.                     chart.setOption(result);
  24.                 }
  25.             });
  26.         }
  27.     )
  28.     </script>
  29. </body>
  30. </html>

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

  1. @app.route("/")
  2. def index():
  3.     data = request.args.to_dict()
  4.     return render_template("index.html", result_json=data)
  5. @app.route("/barChart")
  6. def get_bar_chart():
  7.     args = request.args.to_dict()
  8.     result = eval(args.get("result"))
  9.     name = result.get("name")
  10.     subtitle = result.get("subtitle")
  11.     c = bar_base(name, subtitle)
  12.     return c.dump_options_with_quotes()

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

7c46a31044160fdb07de81470c4edc78.png

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

Python获取NBA历史巨星和现役所有球员生涯数据曲线

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

定时全量更新图表

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

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Awesome-pyecharts</title>
  6.     <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
  7.     <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
  8. </head>
  9. <body>
  10.     <div id="bar" style="width:1000px; height:600px;"></div>
  11.     <script>
  12.         var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
  13.         $(
  14.             function () {
  15.                 fetchData(chart);
  16.                 setInterval(fetchData, 2000);
  17.             }
  18.         );
  19.         function fetchData() {
  20.             $.ajax({
  21.                 type"GET",
  22.                 url: "http://127.0.0.1:5000/barChart",
  23.                 dataType: 'json',
  24.                 success: function (result) {
  25.                     chart.setOption(result);
  26.                 }
  27.             });
  28.         }
  29.     </script>
  30. </body>
  31. </html>

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

  1. def bar_base() -> Bar:
  2.     c = (
  3.         Bar()
  4.             .add_xaxis(["衬衫""羊毛衫""雪纺衫""裤子""高跟鞋""袜子"])
  5.             .add_yaxis("商家A", [random.randint(10100for _ in range(6)])
  6.             .add_yaxis("商家B", [random.randint(10100for _ in range(6)])
  7.             .set_global_opts(title_opts=opts.TitleOpts(title="", subtitle=""))
  8.     )
  9.     return c
  10. @app.route("/")
  11. def index():
  12.     return render_template("index.html")
  13. @app.route("/barChart")
  14. def get_bar_chart():
  15.     c = bar_base()
  16.     return c.dump_options_with_quotes()

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

136c2a5f40a2bb43e4e722d60feb20f4.gif
定时更新图表

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

定时增量更新图表

同样的要对 index.html 做修改

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Awesome-pyecharts</title>
  6.     <script src="https://cdn.bootcss.com/jquery/3.0.0/jquery.min.js"></script>
  7.     <script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
  8. </head>
  9. <body>
  10.     <div id="bar" style="width:1000px; height:600px;"></div>
  11.     <script>
  12.         var chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
  13.         var old_data = [];
  14.         $(
  15.             function () {
  16.                 fetchData(chart);
  17.                 setInterval(getDynamicData, 2000);
  18.             }
  19.         );
  20.         function fetchData() {
  21.             $.ajax({
  22.                 type"GET",
  23.                 url: "http://127.0.0.1:5000/lineChart",
  24.                 dataType: "json",
  25.                 success: function (result) {
  26.                     chart.setOption(result);
  27.                     old_data = chart.getOption().series[0].data;
  28.                 }
  29.             });
  30.         }
  31.         function getDynamicData() {
  32.             $.ajax({
  33.                 type"GET",
  34.                 url: "http://127.0.0.1:5000/lineDynamicData",
  35.                 dataType: "json",
  36.                 success: function (result) {
  37.                     old_data.push([result.name, result.value]);
  38.                     chart.setOption({
  39.                         series: [{data: old_data}]
  40.                     });
  41.                 }
  42.             });
  43.         }
  44.     </script>
  45. </body>
  46. </html>

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

  1. from pyecharts.charts import Line
  2. def line_base() -> Line:
  3.     line = (
  4.         Line()
  5.         .add_xaxis(["{}".format(i) for i in range(10)])
  6.         .add_yaxis(
  7.             series_name="",
  8.             y_axis=[randrange(5080for _ in range(10)],
  9.             is_smooth=True,
  10.             label_opts=opts.LabelOpts(is_show=False),
  11.         )
  12.         .set_global_opts(
  13.             title_opts=opts.TitleOpts(title="动态数据"),
  14.             xaxis_opts=opts.AxisOpts(type_="value"),
  15.             yaxis_opts=opts.AxisOpts(type_="value"),
  16.         )
  17.     )
  18.     return line
  19. @app.route("/")
  20. def index():
  21.     return render_template("index.html")
  22. @app.route("/lineChart")
  23. def get_line_chart():
  24.     c = line_base()
  25.     return c.dump_options_with_quotes()
  26. idx = 9
  27. @app.route("/lineDynamicData")
  28. def update_line_data():
  29.     global idx
  30.     idx = idx + 1
  31.     return jsonify({"name": idx, "value": randrange(5080)})

走起,来看看效果吧

d32edeb91f3957ef85d465374b183fe3.gif

掌握基本的 Flask 技能还是非常有必要的,你学会了吗?

  1. 推荐阅读:
  2. 入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
  3. 干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
  4. 趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
  5. AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
  6. 小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|

年度爆款文案

点阅读原文,看B站我的20个视频!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/918580
推荐阅读
相关标签
  

闽ICP备14008679号