echart实现动态折线图(vue3+ts)
最近接到个任务,需要用vue3实现动态折线图。之前没有用过,所以一路坎坷,现在记录一下,以后也好回忆一下。
之前不清楚echart的绘制方式,以为是在第一秒的基础上绘制第二秒,后面实验过后,发现并不是,它是每秒都重新绘制整张图。比如现在data里只有一个数据,那他就是一个点;过一秒之后data里新增一个数据,那么就有两个点,一条线段,依次类推。
话说回来,怎么实现动态的折线图,回想视频的原理,也就是一帧帧的图片快速切换,欺骗人眼产生动态的效果。所以折线图,也是如此,需要设定一个重要的maxLength,当data里的数据长度到达这个maxLength,使用shift()函数去掉data里的第一个数据,新的data数组和旧的data数组不同,这样两个画面绘制切换,就形成了动态的效果。
好了,现在有了基本理论,该干活了。任务是生成一段折线图如图所示:
t0是当前时刻点,左边实线是历史数据,右侧数据是预测数据,预测数据根据当前时刻点进行变化。但是echart没办法实现一个数据前面实线后面虚线,只能分成两个数据来拼接,假设现在只需要一个静态的画面,那么可以这样实现:建立一个数组data,[历史数据,预测数据]这样的形式划分,然后分别绘制不同的线段。但是现在需要动态展示。。。
折腾了许久,有了第一版的设计:设计历史数据只显示在x轴的2/3,预测数据全部显示,那么超出的预测数据部分就好像是对历史数据的一种预测,效果如图:
对面在看了这种效果之后,觉得还可以。我也就草草实现,没管细节了。结果过了几天告诉我,增加需求:要求可以显示距离报警时间还有多久以及报警之后还有多久报警解除。这个逻辑上是好加的,很简单。按照这样的思路:
第一如果dataPoint小于outlier且predictions数组里的值都小于outlier的时候显示“状态正常”;第二如果dataPoint小于outlier,但是predictions数组里的值有值大于等于outlier的时候,取第一个满足这个条件的值的索引x,显示“距离实际报警还有x分钟”;第三如果dataPoint大于等于outlier且predictions数组里的值都大于等于outlier的时候显示“已报警,未来持续一段时间”;第四如果dataPoint大于等于outlier,但是predictions数组里的值有值小于outlier的时候,取第一个满足这个条件的值的索引x,显示“已报警,距离警报解除还有x分钟”; dataPoint和predictions都是在updateData中定义变化的。
dataPoint表示实时值,outlier表示阈值,predictions表示实时值对应的预测数据数组。
实战显示,折线图真实情况和对应标题总是对不齐,说明这两条线有大问题。之前只是大概满足这个形式,这回需要精确到点,所以暴露问题了。
问题1:历史数据每秒增加1个点,预测数据每秒增加15个点(大于1个点)
问题2:根据echart的绘制机制,二者动起来的方式都是先到达设定的最大长度,且刚开始都是从最左边开始绘制,所以如果按照一般形式,二者根本对不齐。
这里开始尝试很多解决办法,首先是预测数据的存储方式。比如现在是
第一秒:历史数据是a,预测数据是1,2,3,那么预测队列为1,2,3;
第二秒:历史数据是b,预测数据是4,5,6,那么预测队列为1,4,5,6;
第三秒:历史数据是c,预测数据是7,8,9,那么预测队列为1,4,7,8,9;
以此类推,对应算法:
保留原预测数据的第一个值,加上新的预测数据if (currentState.currentResponse === null) {// 第一次接收数据currentState.currentResponse = response;allPredictedData.value[extractedName] = [...response];} else {// 将前一次的response第一个值添加到历史currentState.prevFirsts.push(currentState.currentResponse[0]);// 更新当前响应currentState.currentResponse = response;// 合并历史数据和新数据allPredictedData.value[extractedName] = [...currentState.prevFirsts,...currentState.currentResponse];}
由于数据预测的折线图是子组件,所以传值也是个问题。之前值都是存在子组件的,但是这个样子和父组件失去同步,因为父组件有个实时值显示,模拟真实情况传感器的数据。如果分开的话,父组件的值都走完了,点开数据预测界面发现从第一秒开始,那么就露馅了。由于父组件不是我写的,所以看起来也是脑袋大。
可算改完了,这回实时值和预测值都由父组件提供,子组件只负责数据的显示。蛋疼的是数据预测是向服务器请求的,所以其实实时值和对应的预测数据如果不加处理,无法直接对其,故将实时值的时间戳和对应的预测数据保存,子组件通过监测道名称和时间戳获取对应数据。
const currentTimestamp = item.data[currentIndex.value]?.timestamp;allPredictedData.value[extractedName].push({timestamp: currentTimestamp,prediction: response
});
这么尝试多次后(一两天把。。),发现问题仍然无法解决,一度怀疑是不是echart的问题,还是什么玄学。后面静下心来想想,在纸上debug了一下,理清逻辑之后发现问题所在。设计出来了最终版:
报警时间预测不准的原因是因为两个问题:1.二者起始没对齐 2.每秒增加的点数不同。
所以想到了使用填充的方式来使二者在开始对齐,右边是历史数据的方式。
第一步:获取监测道的全部数据(模拟传感器的实时数据,所以是有全部数据)
第二步:打开折线图的时候,获取当前点的dataPoint;
2.1 结合data,从dataPoint向前进行判断有多个点x;
2.2填充null,形式为[null,x,dataPoint]共20个点;这三步便生成了初始的20个点,后面更新的步骤为:
2.3获取新的dataPoint,加入初始数组,初始数组.shift()
左边则是预测数据:
第一步:初始化和历史数据相同,到2.2生成了一个[null,x,dataPoint]初始历史数据数组,此时加入当前点的预测数据生成新的数组:[初始历史数据数组,实时点对应的预测数据],这就是一个初始预测数据数组;
第二步:初始历史数组.shift(),追加上一个点对应预测数据的第一个点,生成第二个历史数据数组;
追加实时值的预测数据:[第二个历史数据数组,实时点对应的预测数据]。
下图为打开折线图的示意图:
相关文章:
echart实现动态折线图(vue3+ts)
最近接到个任务,需要用vue3实现动态折线图。之前没有用过,所以一路坎坷,现在记录一下,以后也好回忆一下。 之前不清楚echart的绘制方式,以为是在第一秒的基础上绘制第二秒,后面实验过后,发现并…...
Web3(阶段一:入门)——椭圆曲线
一、快速概览 ECC 是一种基于有限域上椭圆曲线代数结构的公钥加密系统。它提供与 RSA 相当的安全性,但密钥长度要短得多,从而实现更快的计算速度和更低的资源使用率。ECC 广泛应用于各种应用,包括安全通信、数字签名和加密货币。 二、什…...
vue总结
1.vue是什么。 vue是javascript和html结合后的,实现了html的模块开发,并且样式和js互不影响。组件内的javascript逻辑只在组件内有效,当然父类可通过某些方法调用,但是彼此间没有影响。各个组件的样式,通过scope防止了…...
LCR 131. 砍竹子 I
文章目录 题意思路代码 题意 题目链接 思路 代码 class Solution { public:int cuttingBamboo(int bamboo_len) {if (bamboo_len 2)return 1;if (bamboo_len 3)return 2;if (bamboo_len 4)return 4;int x bamboo_len / 3;int ans pow(3, x);int y bamboo_len % 3;if …...
游戏引擎学习第210天
回顾并为今天的工作做准备 今天我们,进行一些编码工作。这部分的编码内容对那些对代码架构感兴趣的人非常有帮助,我认为今天的编码内容会很有教育意义,尤其是在展示一些代码转化的过程中,希望大家能够从中获得一些启发。 接下来…...
40--华为IPSec VPN实战指南:构建企业级加密通道
🛡️ 华为IPSec VPN实战指南:构建企业级加密通道 “当数据开始穿盔甲,黑客只能望’密’兴叹” —— 本文将手把手教你用华为设备搭建军用级加密隧道,从零开始构建网络长城! 文章目录 🛡️ 华为IPSec VPN实战…...
go游戏后端开发28:胡牌算法实现
红中麻将胡牌逻辑开发文档 一、字牌与封牌的字典表构建 在开发红中麻将胡牌逻辑时,首先需要构建非字牌和封牌的字典表。在构建双层表时,需进行判断:若牌为风牌且索引 i 大于 6,则不进行处理。这是因为风牌包含东南西北中&#x…...
CNN注意力机制的进化史:深度解析10种注意力模块如何重塑卷积神经网络
🌟 引言:注意力为何改变CNN的命运? 就像人类视觉会优先聚焦于重要信息,深度学习模型也需要"学会看重点"。从2018年SENet首提通道注意力,到2024年SSCA探索空间-通道协同效应,注意力机制正成为CNN…...
字符串与字符数组的对比
在 C 语言中,字符串 和 字符数组 密切相关,但又有重要区别。以下是它们的对比: 1. 基本定义 字符数组 (char array) 是一个固定大小的数组,元素类型是 char。可以存储字符序列,但不一定以 \0 结尾。例如:…...
mapbox进阶,模仿百度,实现不同楼栋室内楼层切换
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️fill-extrusion 三维填充(白膜)图层样…...
OpenCv高阶(一)——图像金字塔(上采样、下采样)
目录 图像金字塔 一、上下采样原理 1、向下取样 2、向上采样 3、图像金字塔的作用 二、案例实现 1、高斯下采样 2、高斯金字塔中的上采样 3、对下采样的结果做上采样,图像变模糊,无法复原 4、拉普拉斯金字塔(图片复原) 图…...
如何避免“过度承诺”导致的验收失败
如何避免“过度承诺”导致的验收失败?关键在于: 评估可行性、设置合理目标、高频沟通反馈、阶段性验收、做好风险管理。其中设置合理目标至关重要,很多团队往往在项目初期为迎合客户或领导而报出“最理想方案”,忽略了资源、技术及…...
Python爬虫第7节-requests库的高级用法
目录 前言 一、文件上传 二、Cookies 三、会话维持 四、SSL证书验证 五、代理设置 六、超时设置 七、身份认证 八、Prepared Request 前言 上一节,我们认识了requests库的基本用法,像发起GET、POST请求,以及了解Response对象是什么。…...
mysql里面的TIMESTAMP类型对应java什么类型
在MySQL中,TIMESTAMP类型用来存储日期和时间值,显示为YYYY-MM-DD HH:MM:SS格式。在Java中,可以使用java.sql.Timestamp类来对应MySQL中的TIMESTAMP类型。 在Java的POJO(Plain Old Java Object)中,如果你想要…...
Java核心技术面试题
Java面试题分享 通过网盘分享的文件:面试题等2个文件 链接: https://pan.baidu.com/s/1Xw0PzkfAmL8uesYBvrW2-A?pwdpebt 提取码: pebt 一、Java基础篇 1. OOP面向对象 面向对象编程(OOP)是一种编程范式,它利用“类”和“对象”来…...
【技海登峰】Kafka漫谈系列(十)SpringBoot整合Kafka之生产者Producer
【技海登峰】Kafka漫谈系列(十)SpringBoot整合Kafka之生产者Producer spring-kafka官方文档: https://docs.spring.io/spring-kafka/docs/2.8.10/reference/pdf/spring-kafka-reference.pdf KafkaTemplate API: https://docs.spring.io/spring-kafka/api/org/springframewo…...
【简单理解什么是简单工厂、工厂方法与抽象工厂模式】
一、简单工厂模式 1.简单工厂模式 通过一个工厂类集中管理对象的创建 ,通过参数决定具体创建哪个对象。 #适合对象类型较少且变化不频繁的场景,缺点是违反开闭原则(新增产品需修改工厂类) 开闭原则(对扩展开放对修改关闭) :当…...
C++之nullptr
文章目录 前言 一、NULL 1、代码 2、结果 二、nullptr 1、代码 2、结果 总结 前言 当我们谈论空指针时,很难避免谈及nullptr。nullptr是C++11引入的一个关键字,用来表示空指针。在C++中,空指针一直是一个容易引起混淆的问题,因为在早期版本的C++中,通常使用NULL来…...
Java List<JSONObject> 中的数据转换为 List<T>
从方法的功能推测,T 应该是一个具体的 Java Bean 类型,用于将 List<JSONObject> 中的数据转换为 List<T>。以下为你详细介绍如何传递泛型 T 以及如何实现该方法。 import com.alibaba.fastjson.JSONObject; import java.util.ArrayList; im…...
下【STL 之速通pair vector list stack queue set map 】
上一篇 【STL 之速通pair vector list stack queue set map 】 queue note priority_queue pq; 使用的还是很方便的 #include <iostream> #include <queue>using namespace std;int main() {// Queue 示例queue<int> q;q.push(10);q.push(20);q.push(30);…...
安装大数据分析利器Spark
大数据分析利器Spark:部署模式与实践全解析 在大数据领域,Spark是一个热门的开源框架,今天就带大家深入了解Spark及其常见部署模式。Spark是基于内存的快速、通用、可扩展的大数据分析计算引擎,诞生于伯克利大学。与Hadoop相比&a…...
遨游科普:三防平板是指哪三防?有哪些应用场景?
在工业4.0与数字化转型的浪潮中,平板电脑早已突破消费娱乐的边界,成为工业生产流程中不可或缺的智能终端。但是,传统消费级平板在复杂工业环境中的“脆弱性”——屏幕易碎、接口易进尘、机身惧水等问题——严重制约了其在专业领域的深度应用。…...
9. RabbitMQ 消息队列幂等性,优先级队列,惰性队列的详细说明
9. RabbitMQ 消息队列幂等性,优先级队列,惰性队列的详细说明 文章目录 9. RabbitMQ 消息队列幂等性,优先级队列,惰性队列的详细说明1. RabbitMQ 消息队列的 “ 幂等性 ” 的问题1.1 RabbitMQ 消息队列的“幂等性”的概念 2. Rabbi…...
k8s创建一个pod,查看状态和详细信息,进入pod,以及删除这个pod
在 Kubernetes(K8s)中,可以使用 kubectl 命令行工具来完成创建 Pod、查看状态和详细信息、进入 Pod 以及删除 Pod 的操作。以下是具体步骤: 创建一个 Pod: 假设你有一个简单的 nginx Pod 的 YAML 配置文件 nginx…...
从盲目清运到精准调度:一个AI芯片引发的智慧环卫升级
在深圳某科技园区的清晨,环卫工人老张发现一个奇怪现象:往常需要逐个检查的50个智能垃圾桶,今天系统自动标注了7个待清运点位。这背后是搭载全志T113-i处理器的智能垃圾桶系统在发挥作用,通过AI视觉识别将垃圾满溢检测准确率提升至…...
MQTT协议:IoT通信的轻量级选手
文章总结(帮你们节约时间) MQTT协议是一种轻量级的发布/订阅通信协议。MQTT通信包括连接建立、订阅、发布和断开等过程。MQTT基于TCP/IP,其通信过程涉及多种控制包和数据包。ESP32S3可以通过MQTT协议接收消息来控制IO9引脚上的LED。 想象一…...
Docker 入门指南:基础知识解析
1. 引言 1.1 为什么学习 Docker 1.1.1 Docker 的优势 环境一致:在不同环境中(开发、测试、生产)保持一致的运行环境。快速部署:容器启动速度快,适合微服务架构。资源隔离:容器之间相互隔离,避…...
【安当产品应用案例100集】043-安当物联网数据安全传输方案
一、需求背景 物联网(IoT)技术在当前世界各行业中的应用越来越广泛,数据安全和安全数据传输、鉴权成为了物联网解决方案不可或缺的一部分。如何通过有效的安全措施来保护物联网设备的数据传输和鉴权,确保数据在设备和服务器之间或…...
C#/.NET/.NET Core技术前沿周刊 | 第 33 期(2025年4.1-4.6)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…...
Django视图详解
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 一、Django视图是什么? 视图(View) 是Django处理HTTP请求的核心组件。它接收一个HttpRequest对象,处理业务逻辑,并返回一个HttpResponse对象(…...
【区块链+ 人才服务】北京师范大学区块链底层链平台 | FISCO BCOS 应用案例
北京师范大学是教育部直属重点大学,2018 年 6 月,北京师范大学成立知识区块链研究中心,致力于区块链基础技术及其在教育领域的应用研究。 2020 年6 月18 日, 北京市人民政府办公厅发布《北京市区块链创新发展行 动计划(2020—202…...
java设计模式-模板方法模式
模板方法模式 编写制作豆浆的程序,说明如下 1)制作豆浆的流程选材添加配料浸泡放到豆浆机打碎 2)通过添加不同的配料,可以制作出不同口味的豆浆 3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的 4)请使用模板方法模式完成 说明…...
同步通信、异步通信、并行传输和串行传输
同步通信、异步通信、并行传输和串行传输是通信与数据传输领域的关键概念,它们既相互关联又有本质区别。以下是详细解释和对比: 1. 核心概念分类 通信方式:描述数据传输的时序和协调规则。 同步通信(Synchronous Communi…...
JVM生产环境调优实战
案例三:JVM频繁Full GC优化 1. 项目背景(Situation) 在云中万维跨境支付的反洗钱系统中,我们负责对海量交易数据进行实时规则校验,以确保符合监管要求。系统日均处理交易量超过500万笔,峰值QPS达到3000&a…...
Python: sqlite3.OperationalError: no such table: ***解析
出现该错误说明数据库中没有成功创建 reviews 表。以下是完整的解决方案: 步骤 1:创建数据库表 在插入数据前,必须先执行建表语句。请通过以下任一方式创建表: 方式一:使用 SQLite 命令行 bash 复制 # 进入 SQLit…...
JVM考古现场(十七):鸿蒙初辟——从太极二进到混沌原初的编译天道
"此刻正是奇点编译的第3.1415926秒!伏羲的算筹正在撕裂冯诺依曼架构的次元壁!诸君请看——这JVM堆内存中正在孕育盘古的元神!" 目录(终极扩展) 第一章:太极二进——内存模型的阴阳交缠 第二章&a…...
Python 字典和集合(字典推导)
本章内容的大纲如下: 常见的字典方法 如何处理查找不到的键 标准库中 dict 类型的变种set 和 frozenset 类型 散列表的工作原理 散列表带来的潜在影响(什么样的数据类型可作为键、不可预知的 顺序,等等) 字典推导 自 Python 2.7 …...
【AI】prompt engineering
prompt engineering ## prompt engineering ## prompt engineering ## prompt engineering 一、定义 Prompt 工程(Prompt Engineering)是指在使用语言模型(如 ChatGPT、文心一言等)等人工智能工具时,设计和优化输入提…...
小刚说C语言刷题——第18讲 循环之while和do-while语句
昨天我们讲了循环语句中的for语句,它主要用于循环次数已知的情况,但是对应循环次数未知的情况,我们又怎么办?这就要用到while和do-while语句了。 1.while语句 (1)语法格式 while(条件表达式) { 循环体; } (2)执行过程 当执…...
[Mysql]buffersize修改
1、找到my.cnf文件位置 ps -ef|grep mysqld 2、编辑my.cnf cd /etc/my.cnf.d vim my.cnf 一般修改为内存的50%~70% 3、重启服务 systemctl restart mysqld...
自定义数据结构的QVariant序列化 ASSERT failure in QVariant::save: “invalid type to save“
自定义数据结构放入QVariant,在序列化时抛出异常 ASSERT failure in QVariant::save: “invalid type to save” 自定义数据结构如struct MyData,除了要在结构体后面加 struct MyData { ... } Q_DECLARE_METATYPE(MyData)如果需要用到流的输入输出&…...
带约束的智能优化算法
带约束的智能优化算法 约束条件和优化问题(可改)粒子群算法麻雀搜索算法鲸鱼优化算法灰狼优化算法免疫优化算法人工蜂群算法沙猫群算法萤火虫算法资源 约束条件和优化问题(可改) 粒子群算法 麻雀搜索算法 鲸鱼优化算法 灰狼优化算法 免疫优化算法 人工蜂群算法 沙猫群算法 萤火…...
【硬核实战】从零打造智能五子棋AI:JavaScript实现与算法深度解析
🌟【硬核实战】从零打造智能五子棋AI:JavaScript实现与算法深度解析🌟 📜 前言:当传统棋艺遇上人工智能 五子棋作为中国传统棋类游戏,规则简单却变化无穷。本文将带你用纯前端技术实现一个具备AI对战功能…...
使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南
使用 kind 创建 K8s 集群并部署 StarRocks 的完整指南 本文档详细介绍如何使用 kind 创建 Kubernetes 集群,并在其上使用 Helm 部署 StarRocks 集群(非高可用模式)。同时也包括如何访问 StarRocks 集群并导入数据。 目录 前提条件参考文档…...
华为OD全流程解析+备考攻略+经验分享
华为OD全流程解析,备考攻略 快捷目录 华为OD全流程解析,备考攻略一、什么是华为OD?二、什么是华为OD机试?三、华为OD面试流程四、华为OD薪资待遇及职级体系五、ABCDE卷类型及特点六、题型与考点七、机试备考策略八、薪资与转正九、…...
数据库中的数组: MySQL与StarRocks的数组操作解析
在现代数据处理中, 数组 (Array) 作为一种高效存储和操作结构化数据的方式, 被广泛应用于日志分析, 用户行为统计, 标签系统等场景. 然而, 不同数据库对数组的支持差异显著. 本文将以MySQL和StarRocks为例, 深入解析它们的数组操作能力, 并对比其适用场景. 文章目录 一 为什么需…...
Qt 交叉编译详细配置指南
一、Qt 交叉编译详细配置 1. 准备工作 1.1 安装交叉编译工具链 # 例如安装ARM工具链(Ubuntu/Debian) sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf# 或者64位ARM sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu 1.2 准备目标…...
【详细图文】在VScode中配置python开发环境
目录 一、下载安装VSCode 1、官网下载VSCode 2、安装VSCode 3、汉化vscode (1)已自动下载汉化版插件 (2)未自动下载汉化版插件 二、 下载安装Python 1、官网下载Python 2、安装Python (1)双击打开…...
strings.Fields 使用详解
目录 1. 官方包 2. 支持版本 3. 官方说明 4. 作用 5. 实现原理 6. 推荐使用场景和不推荐使用场景 推荐场景 不推荐场景 7. 使用场景示例 示例1:官方示例 示例2:解析服务器日志 示例3:清理用户输入 8. 性能比较 性能特点 对比表…...
PCI认证 密钥注入 ECC算法工具 NID_secp521r1 国密算法 openssl 全套证书生成,从证书提取公私钥数组 x,y等
步骤 1.全套证书已经生成。OK 2.找国芯要ECC加密解密签名验签代码。给的逻辑说明没有示例代码很难的上。 3.集成到工具 与SP联调。 1.用openssl全套证书生成及验证 注意:这里CA 签发 KLD 证书用的是SHA256。因为芯片只支持SHA256算法,不支持SHA512。改成统一。…...