1. 程式人生 > >echarts 多個series圖表的tooltip自定義

echarts 多個series圖表的tooltip自定義

   在使用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裡位置)屬性來判斷圖表型別;程式碼實現如下:

   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',
              },
            ]
          });
        },
auth.js中定義函式,對不同型別資料做處理:
  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的處理方法;

     完成後效果還不錯,可惜沒法截圖安靜