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(),追加上一個點對應預測數據的第一個點,生成第二個歷史數據數組;

追加實時值的預測數據:[第二個歷史數據數組,實時點對應的預測數據]。

下圖為打開折線圖的示意圖:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900614.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900614.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900614.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java學習——day24(反射進階:注解與動態代理)

文章目錄 1. 反射與注解2. 動態代理3. 實踐:編寫動態代理示例4. 注解定義與使用5. 動態代理6. 小結與思考 1. 反射與注解 注解:注解是 Java 提供的用于在代碼中添加元數據的機制。它不會影響程序的執行,但可以在運行時通過反射獲取和處理。反…

C++之nullptr

文章目錄 前言 一、NULL 1、代碼 2、結果 二、nullptr 1、代碼 2、結果 總結 前言 當我們談論空指針時,很難避免談及nullptr。nullptr是C++11引入的一個關鍵字,用來表示空指針。在C++中,空指針一直是一個容易引起混淆的問題,因為在早期版本的C++中,通常使用NULL來…

JavaScript惰性加載優化實例

這是之前的一位朋友的酒桌之談,他之前負責的一個電商項目,剛剛開發萬,首頁加載時間特別長,體驗很差,所以就開始排查,發現是在首頁一次性加載所有js導致的問題,這個問題在自己學習的時候并不明顯…

蘋果內購支付 Java 接口

支付流程&#xff0c;APP支付成功后 前端調用后端接口&#xff0c;后端接口將前端支付成功后拿到的憑據傳給蘋果服務器檢查&#xff0c;如果接口返回成功了&#xff0c;就視為支付。 代碼&#xff0c;productId就是蘋果開發者后臺提前設置好的 產品id public CommonResult<S…

數據庫中的數組: MySQL與StarRocks的數組操作解析

在現代數據處理中, 數組 (Array) 作為一種高效存儲和操作結構化數據的方式, 被廣泛應用于日志分析, 用戶行為統計, 標簽系統等場景. 然而, 不同數據庫對數組的支持差異顯著. 本文將以MySQL和StarRocks為例, 深入解析它們的數組操作能力, 并對比其適用場景. 文章目錄 一 為什么需…

LeetCode零錢兌換(動態規劃)

題目描述 給你一個整數數組 coins &#xff0c;表示不同面額的硬幣&#xff1b;以及一個整數 amount &#xff0c;表示總金額。 計算并返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能組成總金額&#xff0c;返回 -1 。 你可以認為每種硬幣的數量是無…

/sys/fs/cgroup/memory/memory.stat 關鍵指標說明

目錄 1. **total_rss**2. **total_inactive_file**3. **total_active_file**4. **shmem**5. **其他相關指標**總結 以下是/sys/fs/cgroup/memory/memory.stat文件中一些關鍵指標的詳細介紹&#xff0c;特別是與PostgreSQL相關的指標&#xff1a; 1. total_rss 定義&#xff1…

C++第14屆藍橋杯b組學習筆記

1. 日期統計 小藍現在有一個長度為 100100 的數組&#xff0c;數組中的每個元素的值都在 00 到 99 的范圍之內。數組中的元素從左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4…

[Effective C++]條款28:避免返回handles指向對象內部成分

. 在C中&#xff0c;返回指向對象內部成分的引用&#xff08;handles&#xff09;可能會導致封裝性降低和對象空懸問題。為了避免這些問題&#xff0c;可以通過返回const引用來限制對內部數據的修改&#xff0c;從而確保只讀訪問 1、返回內部引用對象 下面代碼中getData函數返…

PyTorch 學習筆記

環境&#xff1a;python3.8 PyTorch2.4.1cpu PyCharm 參考鏈接&#xff1a; 快速入門 — PyTorch 教程 2.6.0cu124 文檔 PyTorch 文檔 — PyTorch 2.4 文檔 快速入門 導入庫 import torch from torch import nn from torch.utils.data import DataLoader from torchvision …

windows開啟wsl與輕量級虛擬機管理

基于win 10 打造K8S應用開發環境&#xff08;wsl & kind&#xff09; 一、wsl子系統安裝 1.1 確認windows系統版本 cmd/powershell 或者win r 運行winver 操作系統要> 19044 1.2 開啟wsl功能 控制面板 -> 程序 -> 啟用或關閉Windows功能 開啟適用于Linux的…

C++ -異常之除以 0 問題(整數除以 0 編譯時檢測、整數除以 0 運行時檢測、浮點數除以 0 編譯時檢測、浮點數除以 0 運行時檢測)

一、整數除以 0&#xff08;編譯時檢測&#xff09; 1、演示 #include <iostream>using namespace std;int main() {int result 10 / 0;cout << result << endl;return 0; }程序無法運行&#xff0c;輸出結果 error C2124: 被零除或對零求模2、演示解讀 …

【藍橋杯】搜索算法:剪枝技巧+記憶化搜索

1. 可行性剪枝應用 1.1. 題目 題目描述: 給定一個正整數n和一個正整數目標值target,以及一個由不同正整數組成的數組nums。要求從nums中選出若干個數,每個數可以被選多次,使得這些數的和恰好等于target。問有多少種不同的組合方式? 輸入: 第一行:n和target,表示數組…

Uniapp 集成極光推送(JPush)完整指南

文章目錄 前言一、準備工作1. 注冊極光開發者賬號2. 創建應用3. Uniapp項目準備 二、集成極光推送插件方法一&#xff1a;使用UniPush&#xff08;推薦&#xff09;方法二&#xff1a;手動集成極光推送SDK 三、配置原生平臺參數四、核心功能實現1. 獲取RegistrationID2. 設置別…

Linux中進程

一、認識進程 進程(PCB)內核數據結構(task_struct)程序的代碼和數據 每一個進程都有其獨立的task_struct,OS對眾多的task_struct進行管理&#xff0c;如何管理&#xff1f;先描述再組織&#xff0c;所有運?在系統?的進程都以task_struct鏈表的形式存在內核?&#xff0c;而…

國外的AI工具

一 OpenAI &#xff1a; &#x1f4a1; 總覽&#xff1a; 名稱全稱/代號簡介GPT-4o“o” omniOpenAI 最新的旗艦多模態模型&#xff08;文字、圖像、音頻三模態&#xff09;&#xff0c;比 GPT-4 更強、更快、更便宜。GPT-4o-mini精簡版 GPT-4o輕量級版本&#xff0c;推測為性…

企業級Java開發工具MyEclipse v2025.1——支持AI編碼輔助

MyEclipse一次性提供了巨量的Eclipse插件庫&#xff0c;無需學習任何新的開發語言和工具&#xff0c;便可在一體化的IDE下進行Java EE、Web和PhoneGap移動應用的開發&#xff1b;強大的智能代碼補齊功能&#xff0c;讓企業開發化繁為簡。 立即獲取MyEclipse v2025.1正式版 具…

按鍵長按代碼

這些代碼都存放在定時器中斷中。中斷為100ms中斷一次。 數據判斷&#xff0c;看的懂就看吧

在 macOS 上連接 PostgreSQL 數據庫(pgAdmin、DBeaver)

在 macOS 上連接 PostgreSQL 數據庫 pgAdmin 官方提供的圖形化管理工具&#xff0c;支持 macOS。 下載地址&#xff1a;https://www.pgadmin.org/ pgAdmin 4 是對 pgAdmin 的完全重寫&#xff0c;使用 Python、ReactJs 和 Javascript 構建。一個用 Electron 編寫的桌面運行時…

FTP協議和win server2022安裝ftp

FTP協議簡介 FTP&#xff08;File Transfer Protocol&#xff0c;文件傳輸協議&#xff09;是一種用于在網絡上的計算機之間傳輸文件的標準網絡協議。它被廣泛應用于服務器與客戶端之間的文件上傳、下載以及管理操作。FTP支持多種文件類型和結構&#xff0c;并提供了相對簡單的…