实时数据可视化:使用 Flask, Socket.IO 和 Chart.js 创建动态更新的图表

实现效果:目标是在网页上显示一个实时更新的图表,该图表显示从服务器发送的随机数字。这个过程可以分为以下几个步骤

目标是在网页上显示一个实时更新的图表,该图表显示从服务器发送的随机数字。这个过程可以分为以下几个步骤:

思路和逻辑:
1、 服务器端( 使用flask和flask-socketIO)

  • 设置Flask应用和Flask-socketIO
  • 创建后台线程生成随机数(或者使用自己的数据)
  • 当客户端连接的时候,启动后台线程
from flask import Flask, render_template
from flask_socketio import SocketIO
import random
import time
#Flask 和 render_template: 这两个是 Flask 框架的核心部分,用于创建 web 服务器和渲染 HTML 模板。
#SocketIO: Flask-SocketIO 扩展,为 Flask 应用程序添加对 WebSocket 的支持。
#random: Python 标准库的一部分,用于生成随机数。
#time: Python 标准库的一部分,提供了时间相关的函数,这里用于暂停执行。


#设置 Flask 应用和 Socket.IO
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, cors_allowed_origins="*")
#app = Flask(__name__): 创建一个新的 Flask web 应用实例。
#app.config['SECRET_KEY'] = 'secret!': 设置 Flask 应用的密钥。这个密钥用于保持客户端的会话安全。
#socketio = SocketIO(app, cors_allowed_origins="*"): 创建一个新的 SocketIO 实例,并将其与 Flask 应用关联。



#定义路由和视图
@app.route('/')
def index():
    return render_template('index.html')
# @app.route('/'): 定义一个新的路由,它匹配到网站的根 URL (/)。
#def index(): 定义一个新的视图函数,它将被触发当用户访问根 URL。
#return render_template('index.html'): 渲染并返回 index.html 文件。


#定义后台线程
def background_thread():
    for i in range(10):
    # while True:

        number = random.randint(0, 100)  # 生成随机数
        socketio.emit('new_number', {'number': number}, namespace='/test')
        time.sleep(1)  # 每秒发送一次
#def background_thread(): 定义一个函数,它将在后台运行并定期生成和发送数据。
#for i in range(10): 创建一个循环,它将运行 10 次。
#number = random.randint(0, 100): 生成一个在 0 到 100 之间的随机整数。
#socketio.emit('new_number', {'number': number}, namespace='/test'): 使用 Socket.IO 发送新的随机数到所有连接的客户端。
#time.sleep(1): 暂停执行 1 秒。


#定义 Socket.IO 事件处理程序
@socketio.on('connect', namespace='/test')
def test_connect():
    socketio.start_background_task(target=background_thread)
#@socketio.on('connect', namespace='/test'): 定义一个新的事件处理程序,它将在客户端连接时被触发。
#def test_connect(): 定义事件处理程序的函数。
#socketio.start_background_task(target=background_thread): 启动后台线程。

#启动 Flask 应用
if __name__ == '__main__':
    socketio.run(app, debug=True, allow_unsafe_werkzeug=True)

#if __name__ == '__main__': 确保以下代码只在直接运行此脚本时执行。
#socketio.run(app, debug=True, allow_unsafe_werkzeug=True): 启动 Flask 应用,并允许使用 Werkzeug 服务器(仅用于开发目的)。

2、 客户端(使用HTML、JavaScript、Chart.js 和socket.IO)

  • 创建html页面,包含‘canvas’元素渲染图标
  • 使用js创建Chart.js图标实例,绑定到‘canvas’元素,并初始化为空的数据集
  • 使用Socket.io创建一个到服务器的连接
  • 设置一个socket.io时间监听器,监听来自服务器的数字,当接受数字后,将数字添加到图标的数据集中,更新图标
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Real-Time Chart</title>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script>
</head>
<!-- <meta charset="UTF-8">: 设置文档的字符集为UTF-8。
<meta name="viewport" content="width=device-width, initial-scale=1.0">: 设置视口的宽度为设备的宽度,并且初始缩放为1。

<title>Real-Time Chart</title>: 设置页面的标题。

<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>: 从CDN加载Chart.js库。

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js"></script>: 从CDN加载Socket.io库。  -->
<body>
    <canvas id="myChart" width="400" height="200"></canvas>
    <!--<canvas id="myChart" width="400" height="200"></canvas>: 创建一个canvas元素,它是图表将被渲染到的地方。   -->
    <script>
        var ctx = document.getElementById('myChart').getContext('2d');
        var data = {
            labels: [],
            datasets: [{
                label: 'Real-Time Data',
                data: [],
                backgroundColor: 'rgba(75, 192, 192, 0.2)',
                borderColor: 'rgba(75, 192, 192, 1)',
                borderWidth: 1
            }]
        };

        var myChart = new Chart(ctx, {
            type: 'line',
            data: data,
            options: {
                scales: {
                    y: {
                        beginAtZero: true
                    }
                }
            }
        });

        var socket = io.connect('http://localhost:5000/test');
        socket.on('new_number', function(msg) {

            data.labels.push(new Date().toLocaleTimeString());
            data.datasets[0].data.push(msg.number);
            myChart.update();
        });
	/*<script>标签内的JavaScript代码:
var ctx = document.getElementById('myChart').getContext('2d');: 获取canvas元素,并从中获取2D渲染上下文。
定义 data 对象,其中包括:
labels: 一个空数组,将用于存储X轴上的标签。
datasets: 一个包含一个对象的数组,该对象有以下属性:
label: 数据集的标签。
data: 一个空数组,将用于存储Y轴上的数据点。
backgroundColor 和 borderColor: 定义图表线条和填充的颜色。
borderWidth: 定义图表线条的宽度。
var myChart = new Chart(ctx, { ... }): 使用 ctx 和 data 创建一个新的图表实例。
var socket = io.connect('http://localhost:5000/test');: 创建一个到服务器的Socket.io连接。
socket.on('new_number', function(msg) { ... }): 定义一个事件监听器,当从服务器接收到 new_number 事件时触发。
在事件监听器的回调函数中:
将当前时间的字符串形式推送到 data.labels 数组中。
将从服务器接收到的新数字推送到 data.datasets[0].data 数组中。
调用 myChart.update(); 来更新图表。  */
    </script>
</body>


</html>

3、 需要的库:pip install Flask Flask-SocketIO

4、 代码框架图:

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
28「源码」数据可视化:基于 echarts flask 动态实时大屏 - 数据分析,是一种数据可视化的展示方式,通过将数据转换为图形化的形式,使数据更加直观、易于理解和分析。 该方案采用 echarts 和 flask 这两种技术进行数据可视化的展示。Echarts 是一个基于 JavaScript 的开源可视化库,它提供了丰富的图表类型和交互式的功能,可以满足各种的数据可视化需求。Flask 是 Python 语言中的一个轻量级 Web 框架,它提供了构建 Web 应用的基础框架,同时也可以与其他库和插件进行组合使用,实现更加复杂的功能。 在该方案中,数据从后端数据库中获取,并通过 flask 的模板语言进行处理,然后通过 echarts 绘制出各种类型的图表。整个展示过程通过 WebSocket 技术实现动态更新,大屏幕的内容会实时更新,保障时效性和准确性。同时,在页面设计上也注重视觉效果和用户体验,数据展示界面简洁明了,显示效果清晰美观。 该方案可以被广泛应用于各种需要进行数据可视化展示的领域,例如企业经营数据分析、科学研究领域的数据可视化、金融、航空、物流等领域的数据分析等。由于使用的技术基础较为简单,对于开发人员来说,也具有较高的可拓展性和可维护性。因此,它是一种非常实用的数据可视化方案,可以为用户提供更好的数据分析和决策支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值