赞
踩
制作动态折线图,在视图中需要两个函数,其一为页面函数,用于页面显示。另一个为折线图数据视图函数,用来生成数据传递给Ajax。
- #函数一:关联页面
- @app.route('/') #路由
- def image():
- return render_template('image.html')
这里有个坑,传回Ajax的data数据是以字符串形式传回去的,而我们要使用的是字典形式,所以需要导入flask框架中的jsonify,jsonify的作用是:将数据转为json,并以字典的形式传回前端。
图表中我们以时间为x轴,10以内随机数为y轴
- #函数二:生成数据
- from flask import jsonify #数据转为json,并以字典的形式传回前端
- import datetime,random #导入时间和随机数模块
- @app.route('/setData/') #路由
- def setData():
- now = datetime.datetime.now().strftime('%H:%M:%S')
- data = {'time':now,'data':random.randint(1,10)}
- return jsonify(data) #将数据以字典的形式传回
完整视图页面:
- from flask import Flask,render_template
- app = Flask(__name__) #绑定app
-
- #函数一:关联页面
- @app.route('/') #路由
- def image():
- return render_template('image.html')
-
- #函数二:生成数据
- from flask import jsonify #数据转为json,并以字典的形式传回前端
- import datetime,random #导入时间和随机数模块
- @app.route('/setData/') #路由
- def setData():
- now = datetime.datetime.now().strftime('%H:%M:%S')
- data = {'time':now,'data':random.randint(1,10)}
- return jsonify(data) #将数据以字典的形式传回
-
- if __name__=='__main__':
- app.run()
首先导入jQuery和chart包,由于历史遗留问题,导致我用的是chart1.x的包,与现在的2.x并不兼容,所以有些人会出现无法显示图像的问题,所以这里我导包直接使用网络资源。
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <canvas id="panel" height="330px" width="700px"> </canvas> <!--折线图位置-->
-
- <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <!--导入jQuery-->
- <script src="/static/js/Chart.min.js"></script> <!--导入Chart-->
- <script>
- $(function () {
- var can = $('#panel').get(0).getContext('2d'); /*绘制类型*/
- //定义图标的数据
- var canData = {
- labels:["a","b","c","d","e","f"], /*初始x轴数据*/
- datasets : [
- {
- //折线的填充颜色
- fillColor:"rgba(255,255,255,0.1)",
- //线条颜色:
- strokeColor:"rgba(255,255,0,1)",
- //y轴初始数据:
- data:[1,3,2,1,5,4]
- }
- ]
- };
- //绘制图片
- var line = new Chart(can).Line(canData);
- })
- </script>
- </body>
- </html>
此时可以看到一个静态的折线图:
绘制好折线图后,通过Ajax获取视图中传过来的data字典,并每一秒更新一次:
- var int = setInterval(function () { //设置定时器
- $.ajax(
- {
- url:"/setData/", //从setData函数中获取数据
- type:"get",
- data:"",
- success:function (data) {
- line.addData(
- [data["data"]], //y轴,因为同一个x轴可以有多个折线
- data["time"] //x轴
- );
- //保持x轴只有8个数据,要不随着时间推移x轴会越来越长
- var len = line.datasets[0].points.length;
- if(len>8){
- line.removeData()
- }
- }
- }
- )
- },1000)
完整的前端页面代码:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <canvas id="panel" height="330px" width="700px"> </canvas> <!--折线图位置-->
-
- <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <!--导入jQuery-->
- <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script> <!--导入jQuery-->
- <script>
- $(function () {
- var can = $('#panel').get(0).getContext('2d'); /*绘制类型*/
- //定义图标的数据
- var canData = {
- labels:["a","b","c","d","e","f"], /*初始x轴数据*/
- datasets : [
- {
- //折线的填充颜色
- fillColor:"rgba(255,255,255,0.1)",
- //线条颜色:
- strokeColor:"rgba(255,255,0,1)",
- //y轴初始数据:
- data:[1,3,2,1,5,4]
- }
- ]
- };
- //绘制图片
- var line = new Chart(can).Line(canData);
- var int = setInterval(function () { //设置定时器
- $.ajax(
- {
- url:"/setData/", //从setData函数中获取数据
- type:"get",
- data:"",
- success:function (data) {
- line.addData(
- [data["data"]], //y轴,因为同一个x轴可以有多个折线
- data["time"] //x轴
- );
- //保持x轴只有8个数据,要不随着时间推移x轴会越来越长
- var len = line.datasets[0].points.length;
- if(len>8){
- line.removeData()
- }
- }
- }
- )
- },1000)
- })
-
- </script>
- </body>
- </html>
最后动态效果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。