折線圖實現(xiàn)數(shù)據(jù)預(yù)測功能

需求梳理

功能點:

  • 實現(xiàn)當(dāng)前數(shù)據(jù)與預(yù)測數(shù)據(jù)對比
  • 實現(xiàn)y軸最小值動態(tài)賦值
  • 解決數(shù)據(jù)刷新重新繪制
  • tooltip自定義
  • 預(yù)測數(shù)據(jù)如何設(shè)置
  • 實現(xiàn)容器自適應(yīng)

代碼實現(xiàn)

js代碼

 let linesOption = {
            title: {
                text: '折線圖堆疊'
            },
            tooltip: {
                trigger: 'axis',
                formatter: function (params, ticket, callback) { // tooltip自定義處理
                        var htmlStr = '';
                        var valMap = {};
                        for(var i=0;i<params.length;i++){
                            var param = params[i];
                            var xName = param.name;//x軸的名稱
                            var seriesName = param.seriesName;//圖例名稱
                            var value = param.value;//y軸值
                            var color = param.color;//圖例顏色

                            //過濾無效值
                            if(value == '-'){
                                continue;
                            }

                            //過濾重疊值
                            if(valMap[seriesName] == value){
                                continue;
                            }

                            if(i===0){
                                htmlStr += xName + '<br/>';//x軸的名稱
                            }
                            htmlStr +='<div style="text-align:left;">';
                            //為了保證和原來的效果一樣凛剥,這里自己實現(xiàn)了一個點的效果
                            htmlStr += '<span style="margin-right:5px;display:inline-block;width:10px;height:10px;border-radius:5px;background-color:'+color+';"></span>';

                            //圓點后面顯示的文本
                            if(xName == "預(yù)估"){
                                htmlStr += '預(yù)估'+seriesName + ':' + value;
                            }else{
                                htmlStr += seriesName + ':' + value;
                            }

                            htmlStr += '</div>';
                            valMap[seriesName] = value;
                        }
                        console.log(htmlStr)
                        return htmlStr;
                    }
            },
            legend: {
                data: ['郵件營銷', '聯(lián)盟廣告', '視頻廣告', '直接訪問', '搜索引擎']
            },
            grid: {
                left: '3%',
                right: '4%',
                bottom: '3%',
                containLabel: true
            },
            toolbox: {
                feature: {
                    saveAsImage: {}
                }
            },
            xAxis: {
                type: 'category',
                boundaryGap: false,
                data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
            },
            yAxis: {
                type: 'value',
                min:Math.min(...list)
            },
            series: [
                {
                    name: '郵件營銷',
                    type: 'line',
                    data: [120, 132, 101, 134, 90, 230, 210],
                    symbol:'circle',
                    symbolSize:8,
                },
                {
                    name: '聯(lián)盟廣告',
                    type: 'line',
                    data: [220, 182, 191, 234, 290, 330, 310],
                    symbol:'circle',
                    symbolSize:8,
                },
                {
                    name: '視頻廣告',
                    type: 'line',
                    data: [150, 232, 201, 154, 190, 330, 410],
                    symbol:'circle',
                    symbolSize:8,
                },
                {
                    name: '直接訪問',
                    type: 'line',
                    data: [320, 332, 301, 334, 390, 330, 320],
                    symbol:'circle',
                    symbolSize:8,
                },
                {
                    name: '搜索引擎',
                    type: 'line',
                    data: [820, 932, 901, 934, 1290, 1330, 1320],
                    symbol:'circle',
                    symbolSize:8,
                },
                 {
                    name: '郵件營銷',
                    type: 'line',
                    data: ['-', '-', '-', '-', '-', '-', 210,350],
                    symbol:'circle',
                    symbolSize:8,
                    lineStyle:{
                        normal:{
                            type:'dotted'
                        }
                    }
                },
                {
                    name: '聯(lián)盟廣告',
                    type: 'line',
                    data: ['-', '-', '-', '-', '-', '-', 310,600],
                    symbol:'circle',
                    lineStyle:{
                        normal:{
                            type:'dotted'
                        }
                    }
                },
                {
                    name: '視頻廣告',
                    type: 'line',
                    data: ['-', '-', '-', '-', '-', '-', 410,100],
                    symbol:'circle',
                    symbolSize:8,
                    lineStyle:{
                        normal:{
                            type:'dotted'
                        }
                    }
                },
                {
                    name: '直接訪問',
                    type: 'line',
                    data: ['-', '-', '-', '-', '-', '-', 320,203],
                    symbol:'circle',
                    symbolSize:8,
                    lineStyle:{
                        normal:{
                            type:'dotted'
                        }
                    }
                },
                {
                    name: '搜索引擎',
                    type: 'line',
                    data: ['-', '-', '-', '-', '-', '-', 1320,450],
                    symbol:'circle',
                    symbolSize:8,
                    lineStyle:{
                        normal:{
                            type:'dotted'
                        }
                    }

                }
            ]
        };
        this.linesOptionChart = this.$echarts.init(this.$refs.linesOptionChart) // 圖標(biāo)數(shù)據(jù)初始化
        this.linesOptionChart.setOption(linesOption,true)// true表示頁面數(shù)據(jù)變更  頁面重新繪制

html實現(xiàn)

<div style="height:400px" ref="linesOptionChart"></div>

自適應(yīng)實現(xiàn)

data(){
  return {
      linesOptionChart:null
  }
},
mouned(){

     window.addEventListener("resize", () => {
            // 如果有多個echarts风喇,就在這里執(zhí)行多個echarts實例的resize方法,不過一般要做組件化開發(fā),即一個.vue文件只會放置一個echarts實例
            this.linesOptionChart.resize()
        });
},
methods(){
    this.linesOptionChart= .....// 此處接文章頂部js處理代碼  調(diào)用接口賦值
},
beforeDestroy() {
        /* 頁面組件銷毀的時候桐经,別忘了移除綁定的監(jiān)聽resize事件豌蟋,否則的話,多渲染幾次
        容易導(dǎo)致內(nèi)存泄漏和額外CPU或GPU占用哦*/
        window.removeEventListener("resize", () => {\
            this.linesOptionChart.resize()
        });
    },

效果

效果圖

實現(xiàn)y軸最小值動態(tài)賦值

實現(xiàn)思路:

循環(huán)遍歷 series數(shù)組中的data 使用Math.min(...data) 放入預(yù)先定義的數(shù)組list中 最終獲取list中的最小值 即為所有折線數(shù)據(jù)中的最小值

  let list =[]
  series.map(item=>{
      if(item.data.indexOf('-')>-1){
              let dataList = []
              item.data.find('-').length&&(item.data(val=>{
             if(val==='-'){
                 dataList.push(0)
              }else{
                dataList.push(val)
              }
          }))
           list.push(Math.min(...dataList))
      }else{
           list.push(Math.min(...item.data) )
       }
  })

.....
 yAxis: {
      type: 'value',
      min:Math.min(...list)
 },
   
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哈街,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拒迅,老刑警劉巖骚秦,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異璧微,居然都是意外死亡作箍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門前硫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胞得,“玉大人,你說我怎么就攤上這事屹电〗捉#” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵危号,是天一觀的道長牧愁。 經(jīng)常有香客問我,道長外莲,這世上最難降的妖魔是什么猪半? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮偷线,結(jié)果婚禮上磨确,老公的妹妹穿的比我還像新娘。我一直安慰自己声邦,他們只是感情好乏奥,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著亥曹,像睡著了一般邓了。 火紅的嫁衣襯著肌膚如雪盏檐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天驶悟,我揣著相機與錄音胡野,去河邊找鬼。 笑死痕鳍,一個胖子當(dāng)著我的面吹牛硫豆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播笼呆,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼熊响,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诗赌?” 一聲冷哼從身側(cè)響起汗茄,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铭若,沒想到半個月后洪碳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡叼屠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年瞳腌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镜雨。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫂侍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荚坞,到底是詐尸還是另有隱情挑宠,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布颓影,位于F島的核電站各淀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瞭空。R本人自食惡果不足惜揪阿,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一疗我、第九天 我趴在偏房一處隱蔽的房頂上張望咆畏。 院中可真熱鬧,春花似錦吴裤、人聲如沸旧找。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钮蛛。三九已至鞭缭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間魏颓,已是汗流浹背岭辣。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留甸饱,地道東北人沦童。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像叹话,于是被迫代替她去往敵國和親偷遗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容