echarts 多個series圖表的tooltip自定義
阿新 • • 發佈:2019-02-08
在使用echarts製作資料圖表時,由於一張圖表中包含多個series並且是多種型別資料(折線圖,散點圖,自定義圖等),最初所有資料都是在各自的series.tooltip中定義提示資訊,這種情況下預設tooltip的觸發方式是‘item’的方式,但是折線圖在這種方式下的使用就很蛋疼了,必須要點中資料點,提示才會出來,但是資料點又比較小,很難點中,使用者反饋很不好用;
為了使用者體驗更好,只好改程式碼了,本來打算只對折線圖採用座標觸發(‘axis’),但是series.tooltip無法設定觸發方式,只好更改option.tooptip觸發方式為‘axis’,;在這裡又碰到了問題,修改後的觸發方式作用在所有的series上了,也就是之前自定義的series.tooltip全都無效了,查echarts官方文件才發現:series.tooltip 僅在 tooltip.trigger 為 'item' 時有效。如意算盤落空了,沒法子對不同型別的圖採用不同的觸發方式了;
沒辦法,因為折線圖的體驗效果實在太差,必須要改,只好硬著頭皮改了,所有的資料都採用‘axias’觸發,然後針對不同的圖表給出不同的提示,方法就是:在series.tooltip中使用formatter函式來自定義提示資訊,依據params引數的seriesIndex(資料在series裡位置)屬性來判斷圖表型別;程式碼實現如下:
auth.js中定義函式,對不同型別資料做處理:drawChart1_2() { this.chart1_2 = echarts.init(document.getElementById('chart1_2')); this.chart1_2.setOption({ tooltip:{ trigger:'axis', axisPointer:{ type:'line', lineStyle:{color:'#333',} }, backgroundColor:'#333', formatter:function(params){ let tip = auth.formatterTip(params);/*呼叫auth.js中的formatterTip函式,傳入觸發點資訊引數params*/ return tip ; }, }, xAxis: [], yAxis: [], grid: this.grid, series: [/*多個series*/ { type: 'line', name:'Basal', data:this.DataBasal, }, { type: 'bar', name:'Bolus', data:this.DataBolus, }, { type: 'custom', name:'Extend bolus', data:this.extend_bolus, }, { type: 'scatter', name:'Alert', data: this.pump_alarm, symbol:'image://static/legend/Alert.png', }, ] }); },
formatterTip(params){ // console.log(params); let that = this; let tipArray = [0,0,0,0,0,0,0,0,0],tip = '',timeDetail =''; params.map(function (e,i) { if(e.value[0]!==10){/*去除custom型別資料初始化的影響*/ let index = e.seriesIndex; let name = e.seriesName; let value = e.value[1]; let date = e.value[0]; let time = that.formatterDate5(date); let day = that.formatterDate4(date.getTime()/1000); timeDetail = day+' '+time[0]+':'+time[1]+'<br>';/*設定提示框頭部時間資訊*/ /*判斷資料型別以及是否有資料*/ if((index===0||index===2)&&value)){ /*每一條提示前設定對應顏色的小圓點*/ let icon =" <div style='background: #00ff4c;height: 8px;width: 8px;border-radius: 8px;margin-top:7px;margin-right: 4px;float: left;display: inline-block'></div>"; tipArray[index]= icon + name+' : '+value+'U/H'; } if(index===1&&value){ let icon =" <div style='background: #ff0000;height: 8px;width: 8px;border-radius: 8px;margin-top:7px;margin-right: 4px;float: left;display: inline-block'></div>"; tipArray[1] = icon +' Manual Suspend'; } if(index===3&&value){ let icon =" <div style='background: #182f82;height: 8px;width: 8px;border-radius: 8px;margin-top:7px;margin-right: 4px;float: left;display: inline-block'></div>"; tipArray[3] = icon + name+' : '+e.value[2]+', '+value+'U'; } } }); tip =tip+timeDetail; tipArray.map(function (e,i) { if(e){ tip = tip+e+'<br>';/*組合所有提示資訊*/ } }); return tip;/*返回處理好的提示*/ },
這樣就完成 了echarts座標軸觸發方式下的多個series的tooltip自定義功能;上述函式中只給出了一部分series的處理方法;
完成後效果還不錯,可惜沒法截圖;