当前位置:   article > 正文

Flask框架中利用Ajax制作动态折线图_flask 实现折线图实时变化

flask 实现折线图实时变化

制作动态折线图,在视图中需要两个函数,其一为页面函数,用于页面显示。另一个为折线图数据视图函数,用来生成数据传递给Ajax。

创建前端页面,名为image的html页面,然后准备视图函数:

函数一:关联HTML页面

  1. #函数一:关联页面
  2. @app.route('/') #路由
  3. def image():
  4. return render_template('image.html')

函数二:生成数据以json方式传回给Ajax

这里有个坑,传回Ajax的data数据是以字符串形式传回去的,而我们要使用的是字典形式,所以需要导入flask框架中的jsonify,jsonify的作用是:将数据转为json,并以字典的形式传回前端。

图表中我们以时间为x轴,10以内随机数为y轴

  1. #函数二:生成数据
  2. from flask import jsonify #数据转为json,并以字典的形式传回前端
  3. import datetime,random #导入时间和随机数模块
  4. @app.route('/setData/') #路由
  5. def setData():
  6. now = datetime.datetime.now().strftime('%H:%M:%S')
  7. data = {'time':now,'data':random.randint(1,10)}
  8. return jsonify(data) #将数据以字典的形式传回

完整视图页面:

  1. from flask import Flask,render_template
  2. app = Flask(__name__) #绑定app
  3. #函数一:关联页面
  4. @app.route('/') #路由
  5. def image():
  6. return render_template('image.html')
  7. #函数二:生成数据
  8. from flask import jsonify #数据转为json,并以字典的形式传回前端
  9. import datetime,random #导入时间和随机数模块
  10. @app.route('/setData/') #路由
  11. def setData():
  12. now = datetime.datetime.now().strftime('%H:%M:%S')
  13. data = {'time':now,'data':random.randint(1,10)}
  14. return jsonify(data) #将数据以字典的形式传回
  15. if __name__=='__main__':
  16. app.run()

 

然后在image.html页面中绘制静态折线图:

首先导入jQuery和chart包,由于历史遗留问题,导致我用的是chart1.x的包,与现在的2.x并不兼容,所以有些人会出现无法显示图像的问题,所以这里我导包直接使用网络资源。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <canvas id="panel" height="330px" width="700px"> </canvas> <!--折线图位置-->
  9. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <!--导入jQuery-->
  10. <script src="/static/js/Chart.min.js"></script> <!--导入Chart-->
  11. <script>
  12. $(function () {
  13. var can = $('#panel').get(0).getContext('2d'); /*绘制类型*/
  14. //定义图标的数据
  15. var canData = {
  16. labels:["a","b","c","d","e","f"], /*初始x轴数据*/
  17. datasets : [
  18. {
  19. //折线的填充颜色
  20. fillColor:"rgba(255,255,255,0.1)",
  21. //线条颜色:
  22. strokeColor:"rgba(255,255,0,1)",
  23. //y轴初始数据:
  24. data:[1,3,2,1,5,4]
  25. }
  26. ]
  27. };
  28. //绘制图片
  29. var line = new Chart(can).Line(canData);
  30. })
  31. </script>
  32. </body>
  33. </html>

此时可以看到一个静态的折线图:

 

通过Ajax定时获取数据,制作动态数据

绘制好折线图后,通过Ajax获取视图中传过来的data字典,并每一秒更新一次:

  1. var int = setInterval(function () { //设置定时器
  2. $.ajax(
  3. {
  4. url:"/setData/", //从setData函数中获取数据
  5. type:"get",
  6. data:"",
  7. success:function (data) {
  8. line.addData(
  9. [data["data"]], //y轴,因为同一个x轴可以有多个折线
  10. data["time"] //x轴
  11. );
  12. //保持x轴只有8个数据,要不随着时间推移x轴会越来越长
  13. var len = line.datasets[0].points.length;
  14. if(len>8){
  15. line.removeData()
  16. }
  17. }
  18. }
  19. )
  20. },1000)

完整的前端页面代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <canvas id="panel" height="330px" width="700px"> </canvas> <!--折线图位置-->
  9. <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <!--导入jQuery-->
  10. <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script> <!--导入jQuery-->
  11. <script>
  12. $(function () {
  13. var can = $('#panel').get(0).getContext('2d'); /*绘制类型*/
  14. //定义图标的数据
  15. var canData = {
  16. labels:["a","b","c","d","e","f"], /*初始x轴数据*/
  17. datasets : [
  18. {
  19. //折线的填充颜色
  20. fillColor:"rgba(255,255,255,0.1)",
  21. //线条颜色:
  22. strokeColor:"rgba(255,255,0,1)",
  23. //y轴初始数据:
  24. data:[1,3,2,1,5,4]
  25. }
  26. ]
  27. };
  28. //绘制图片
  29. var line = new Chart(can).Line(canData);
  30. var int = setInterval(function () { //设置定时器
  31. $.ajax(
  32. {
  33. url:"/setData/", //从setData函数中获取数据
  34. type:"get",
  35. data:"",
  36. success:function (data) {
  37. line.addData(
  38. [data["data"]], //y轴,因为同一个x轴可以有多个折线
  39. data["time"] //x轴
  40. );
  41. //保持x轴只有8个数据,要不随着时间推移x轴会越来越长
  42. var len = line.datasets[0].points.length;
  43. if(len>8){
  44. line.removeData()
  45. }
  46. }
  47. }
  48. )
  49. },1000)
  50. })
  51. </script>
  52. </body>
  53. </html>

最后动态效果如下:

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

闽ICP备14008679号