echarts如何實(shí)現(xiàn)動(dòng)態(tài)曲線(xiàn)圖(多條曲線(xiàn))
echarts動(dòng)態(tài)曲線(xiàn)圖(多條曲線(xiàn))
ECharts是一個(gè)由百度開(kāi)發(fā)的開(kāi)源數(shù)據(jù)可視化工具,能夠提供直觀(guān),生動(dòng),可交互,可高度個(gè)性化定制的數(shù)據(jù)可視化圖表。
本項(xiàng)目基于echarts 2.0版本和jquery-3.4.0版本,可實(shí)現(xiàn)點(diǎn)擊“開(kāi)始”按鈕,會(huì)顯示兩條動(dòng)態(tài)曲線(xiàn);點(diǎn)擊“停止”按鈕,曲線(xiàn)清空
項(xiàng)目效果如下圖所示:

廢話(huà)不多說(shuō),直接上代碼
HTML部分
<div id="current_A" style="width: 600px;height:400px;margin-bottom: 100px"></div>
<div class="button_group">
<input class="button" type="button" value="開(kāi)始" id="start" style="margin:0 50px 0">
<input class="button" type="button" value="停止" id="stop" style="margin:0 50px 0">
</div>
這部分比較簡(jiǎn)單,第一個(gè)div用于存放曲線(xiàn)圖,第二個(gè)div用于存放兩個(gè)按鈕。
CSS部分
這部分其實(shí)我主要是想保存一個(gè)好看的按鈕樣式…
.button_group{
position: fixed;
top:400px;
left: 6%
}
.button{
width: 90px;
height: 35px;
border-width: 0px;
border-radius: 3px;
background: #1E90FF;
cursor: pointer;
outline: none;
font-family: Microsoft YaHei;
color: white;
font-size: 15px;
}
JS部分
$(function () {
// 初始化圖表的數(shù)據(jù)輸入數(shù)組
var data_real = [];
var data_pre = [];
var data_length = 30;
for (i=0;i<data_length;i++){
data_pre.push(15000);
data_real.push(15000);
}
//初始化全局變量
var global_status = 0;//加載頁(yè)面時(shí)默認(rèn)為0
//每個(gè)div分別創(chuàng)建一個(gè)form對(duì)象
var CurrentA = new My_form("current_A");
//頁(yè)面加載時(shí)初始化靜態(tài)圖表
CurrentA.init_static()
//定義form類(lèi)
function My_form(element_id){
//form類(lèi)所創(chuàng)建在指定的div的id
this.element_id = element_id
//初始化圖表,在具體指定元素位置創(chuàng)建圖表,并傳入數(shù)據(jù)列表
this.init_static = function(){
this.mychart = echarts.init(document.getElementById(this.element_id));
// 初始化x軸數(shù)據(jù)
var _x_axis = [];
for (var i = 0; i < data_length; i++) {
_x_axis.push(i)
}
// 初始化y軸數(shù)據(jù)
var real_arr = [];
var model_arr = [];
for (var i = 0; i < data_length; i++) {
real_arr.push(15000);
model_arr.push(15000);
}
//設(shè)置圖標(biāo)配置項(xiàng)
this.mychart.setOption({
title: {
text: "某工業(yè)過(guò)程電流變化曲線(xiàn)",
x:'left',
textStyle: {
"fontSize": 16
}
},
tooltip: {
trigger: 'axis'
},
// 調(diào)整圖表在div中的大小
grid:{
top:"35px",
left:"50px",
right:"10px",
bottom:"50px"
},
legend: {
data: ['real', 'model'],
textStyle:{
fontSize: getDpr()
},
x:'center'
},
toolbox: {
show: true,
feature: {
mark: {show: true},
dataView: {show: true, readOnly: false},
magicType: {show: true, type: ['line']},
saveAsImage: {show: true}
}
},
calculable: true,
xAxis: {
type: 'category',
boundaryGap: false,
data: _x_axis
},
yAxis: {
type: 'value',
min:12000,
max:18000,
splitNumber:3
},
series: [{
name: '真實(shí)值',
type: 'line',
color: "red",
data: real_arr
}, {
name: '模型預(yù)估值',
type: 'line',
color: "green",
data: model_arr
}]
})
}
// 更新數(shù)據(jù)函數(shù)
this.update_data = function(real_data,model_data){
this.mychart.setOption({
title: {
text: "某工業(yè)過(guò)程電流變化曲線(xiàn)",
x:'left',
textStyle: {
"fontSize": 16
}
},
series: [{
name: '真實(shí)值',
data: real_data
}, {
name: '模型預(yù)估值',
data: model_data
}]
});
}
}
//“開(kāi)始實(shí)驗(yàn)”按鈕點(diǎn)擊事件
$("input[id='start']").click(function(){
global_status = 1;
})
//“終止實(shí)驗(yàn)”按鈕點(diǎn)擊事件
$("input[id='stop']").click(function () {
global_status =0;
data_real.fill(15000);
data_pre.fill(15000);
CurrentA.init_static()
})
//legend字體大小
function getDpr() {
var windowWidth = $(window).width();
if (windowWidth < 1920) {
return 12
}
if (windowWidth >= 1920 && windowWidth <= 3840) {
return 18
}
if (windowWidth > 3840 && windowWidth <= 5760) {
return 30
}
};
// 更新真實(shí)值
function update_real(shift=true) {
var real_num = (Math.random()-0.5)*2000+15000;
data_real.push( real_num );
if (shift) {
data_real.shift();
}
}
// 更新模型值
function update_pre (shift=true) {
var pre_num = (Math.random()-0.5)*2000+15000;
data_pre.push( pre_num );
if (shift) {
data_pre.shift();
}
}
//計(jì)算均方誤差
function junfang_error(arr1,arr2){
var len=arr1.length;
var sum=0;
for(var i=0;i<len;i++){
sum+=Math.pow(arr1[i]-arr2[i],2)
}
var ans = Math.sqrt(sum/len);
return ans.toFixed(2);
}
//計(jì)算平均絕對(duì)誤差百分比
function pingjun_error(arr_real,arr_model){
var len=arr_real.length;
var sum=0;
for(var i=0;i<len;i++){
sum+= Math.abs(arr_real[i]-arr_model[i]) / arr_real[i]
}
var ans = sum/len*100;
return ans.toFixed(2)+"%"
}
//設(shè)置監(jiān)聽(tīng)函數(shù)每一秒一次
setInterval(function () {
if(global_status===0){
return;
}
update_pre();
update_real();
CurrentA.update_data(data_real,data_pre)
},1000)
})
每個(gè)部分的功能我都寫(xiě)在注釋中了,注意HTML中的div對(duì)應(yīng)的id和form類(lèi)中傳入的參數(shù)應(yīng)保持一致。
真實(shí)值和模型值的更新,這里我用隨機(jī)數(shù)取締了,有需要的話(huà)可以根據(jù)自己實(shí)際需求綁定相應(yīng)的數(shù)據(jù)源。
曲線(xiàn)的條數(shù)這里我用兩條為例,如果一條或者三條及以上的情況,大家可以自己查看代碼進(jìn)行相應(yīng)調(diào)整,難度應(yīng)該不是很大。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript如何實(shí)現(xiàn)元素全排列實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于JavaScript如何實(shí)現(xiàn)元素全排列的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
webpack踩坑系列之less-loader6.0.0的javascriptEnabled報(bào)錯(cuò)問(wèn)題
這篇文章主要介紹了webpack踩坑系列之less-loader6.0.0的javascriptEnabled報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
如何學(xué)JavaScript?前輩的經(jīng)驗(yàn)之談
這篇文章主要介紹了如何學(xué)JavaScript?前輩的經(jīng)驗(yàn)之談,也就是怎么學(xué)前端的問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
javascript+canvas實(shí)現(xiàn)刮刮卡抽獎(jiǎng)效果
這篇文章主要介紹了javascript+canvas實(shí)現(xiàn)刮刮卡抽獎(jiǎng)效果的相關(guān)資料,需要的朋友可以參考下2015-07-07
js實(shí)現(xiàn)簡(jiǎn)單排列組合的方法
這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)單排列組合的方法,可實(shí)現(xiàn)數(shù)學(xué)上排列組合算法功能,涉及JavaScript數(shù)組與字符串操作技巧,需要的朋友可以參考下2016-01-01
JavaScript+css+HTML實(shí)現(xiàn)移動(dòng)端輪播圖(含源碼)
這篇文章主要介紹了JavaScript+css+HTML實(shí)現(xiàn)移動(dòng)端輪播圖并含源碼的分享,需要的小伙伴可以參考一下,希望對(duì)你有所幫助2022-01-01
js實(shí)現(xiàn)精確到秒的日期選擇器完整實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)精確到秒的日期選擇器,以完整實(shí)例形式分析了JavaScript日期選擇器的實(shí)現(xiàn)步驟與相關(guān)技巧,涉及JavaScript針對(duì)時(shí)間與日期的相關(guān)運(yùn)算,需要的朋友可以參考下2016-04-04
詳解webpack require.ensure與require AMD的區(qū)別
本篇文章主要介紹了詳解webpack require.ensure與require AMD的區(qū)別,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12

