echarts實(shí)現(xiàn)動(dòng)態(tài)y軸范圍且平均等分輔助線

導(dǎo)語剧罩,一堆廢話

用echarts繪制走勢(shì)圖時(shí),你是否也有這樣的煩惱座泳,數(shù)據(jù)的值普遍較大惠昔,但是數(shù)據(jù)間的差值卻微乎其微,此時(shí)默認(rèn)生成的走勢(shì)圖就偏向于一條直線挑势,根本沒有參考意義镇防。
那有啥方法可以使得y軸范圍隨數(shù)據(jù)變化,數(shù)據(jù)線永遠(yuǎn)在圖標(biāo)的中間范圍顯示潮饱,輔助線又能均等分呢来氧。
max+min+interval的方式就能輕松解決該問題,到時(shí)候無論是數(shù)據(jù)一會(huì)是0.003還是3000香拉,你都不用擔(dān)心如何處理圖表范圍的問題啦扬。

最終效果

最終效果.png

正文

  1. 首先我們還是先去官網(wǎng)考一個(gè)基礎(chǔ)折線圖表


    1-基礎(chǔ)折線圖.png
  2. 給折線圖加點(diǎn)自己的數(shù)據(jù),和自己喜歡的樣式(體現(xiàn)問題)
    數(shù)據(jù)相差不到1凫碌,但數(shù)據(jù)普遍大于100時(shí)扑毡,走勢(shì)圖就趨于一條直線,且偏上证鸥,體現(xiàn)不出來數(shù)據(jù)的變化僚楞。體現(xiàn)不了數(shù)據(jù)變化的走勢(shì)圖沒有意義勤晚。

    2-增加數(shù)據(jù)和樣式.png

let dateList = ["2021/01/03", "2021/01/04", "2021/01/05", "2021/01/06", "2021/01/07", "2021/01/08", "2021/01/09", "2021/01/10", "2021/01/11", "2021/01/12", "2021/01/13", "2021/01/14", "2021/01/15", "2021/01/16", "2021/01/17", "2021/01/18", "2021/01/19", "2021/01/20", "2021/01/21", "2021/01/22", "2021/01/23", "2021/01/24", "2021/01/25", "2021/01/26", "2021/01/27", "2021/01/28", "2021/01/29"]
// 此處為處理x軸值向中間靠攏枉层,且不被截?cái)嗳郑?qǐng)不要隨意修改空格個(gè)數(shù)
dateList[0] = '                 ' + dateList[0];
dateList[dateList.length - 1] = dateList[dateList.length - 1] + '                   ';
let dataList= ["109.34", "109.35", "109.36", "109.37", "109.38", "109.39", "109.40", "109.41", "109.42", "109.42", "109.43", "109.44", "109.44", "109.45", "109.46", "109.47", "109.48", "109.49", "109.50", "109.50", "109.51", "109.52", "109.53", "109.54", "109.55", "109.55", "109.49"]
option = {
    xAxis: {
        type: 'category',
        data:dateList,
         axisLabel: {
          // 此處為處理x軸值只顯示第一個(gè)和最后一個(gè)日期
          interval: dateList.length - 2,
          textStyle: {
            color: '#999',//坐標(biāo)值得具體的顏色

          }
        },
        axisLine: {
          show: false,//x軸線隱藏
          fontSize: 12,
        },
        axisTick: {
          show: false,//隱藏x軸的標(biāo)點(diǎn)
        },
    },
    yAxis: {
        type: 'value',
         axisLabel: {
          textStyle: {
            color: '#999',

          },
          interval: 'auto',
          formatter: function (value, index) {
           return value.toFixed(2) + '%';
          }
        },
        // 顯示分隔線
        splitLine: {
          show: true,
          lineStyle: {
            color: ['#ccc'],
            width: 1,
            type: 'solid'
          }
        },
    },
    series: [{
        data: dataList,
        type: 'line',
        symbol: 'circle',
        symbolSize: 4,
        itemStyle: {
          color: '#fb563a'
        },
        // 漸變色填充
        areaStyle: {
          // origin設(shè)置填充起始位置,auto默認(rèn)y=0開始,start則從min處開始
          origin: 'start',
          color: {
            type: 'linear',
            x: 0,
            y: 0,
            x2: 0,
            y2: 1,
            colorStops: [{
              offset: 0, color: '#fb563a' // 0% 處的顏色
            }, {
              offset: 1, color: '#fff' // 100% 處的顏色
            }],
            global: false // 缺省為 false
          }
        }
    }]
};
  1. 計(jì)算y軸的范圍
    上面的圖表因?yàn)閿?shù)值變化太小完全體現(xiàn)不出數(shù)據(jù)的變化趨勢(shì)鸟蜡,所以我們應(yīng)該縮小y軸的范圍膜赃,并且將數(shù)據(jù)線集中在圖標(biāo)中部,而不是偏上揉忘。
    3.1. 首先我習(xí)慣應(yīng)用三分原則跳座,如下
    3-1-三分原則.png

    所以數(shù)據(jù)的最大值max與最小值min之差正好要是一份的值,
    yMax = max + (max-min)
    yMin = min - (max-min)
// 計(jì)算數(shù)據(jù)最大值和最小值
let minValue = '0'
let maxValue = '0'
let list = dataList.filter(item => (item && item != 'null' && item != 'NaN'))
let precision = 10000 //精度
maxValue = Math.ceil(Math.max.apply(null, list) * precision) / precision;
minValue = Math.floor(Math.min.apply(null, list) * precision) / precision;
// 計(jì)算間隔泣矛,返回y軸最大值疲眷,y軸最小值 ,間隔
let getLeftData = (min, max) => {
    // 控制分隔條數(shù)您朽,
    let diff = max - min
    return {
      max: max + diff,
      min: min - diff,
    };
}
let interObj = getLeftData(minValue, maxValue)

3.2. 將計(jì)算出的y軸范圍應(yīng)用于echarts
使用yAxis屬性下的min和max可以設(shè)置范圍

       yAxis: {
        type: 'value',
        // 設(shè)置y軸最大值
        min: interObj.min,
        // 設(shè)置y軸最小值
        max: interObj.max,
        ...
    },
3-2-設(shè)置了y軸范圍.png
  1. 輔助線平分
    現(xiàn)在的圖表還存在輔助線不平分的問題狂丝,可以看到圖表中部的輔助線是平分的,但是y軸最大值和最小值上的輔助線的出現(xiàn)使得上下邊緣的輔助線間隔偏小哗总。


    4-邊緣輔助線.png

4.1. 利用splitNumber(無效)
splitNumber:'5'
添加該屬性沒有效果几颜,是因?yàn)槲覀冊(cè)O(shè)置了y軸的max和min,所以splitNumber不起作用
4.2. 使用interval去分隔
interval該方式是通過按設(shè)置的值去切割軸讯屈,如y軸的interval設(shè)置為100蛋哭,則會(huì)將y軸按每份間隔100去分割
故,我們修改一下方法getLeftData 去獲取分隔間隔值

...
let getLeftData = (min, max) => {
    // 控制分隔條數(shù)涮母,
    let diff = max - min
    return {
      max: max + diff,
      min: min - diff,
      // 分割成5等份 
      interval: (max + diff - (min - diff)) / 5,
    };
}
let interObj = getLeftData(minValue, maxValue)
option = {
   ...
    yAxis: {
        type: 'value',
        // 設(shè)置y軸間隔線
        interval:interObj.interval,
        // 設(shè)置y軸最大值
        min: interObj.min,
        // 設(shè)置y軸最小值
        max: interObj.max,
       ...
    },
    ....
};
4-2-interval設(shè)置間隔.png
  1. 完整代碼


// 準(zhǔn)備日期數(shù)據(jù)
let dateList = ["2021/01/03", "2021/01/04", "2021/01/05", "2021/01/06", "2021/01/07", "2021/01/08", "2021/01/09", "2021/01/10", "2021/01/11", "2021/01/12", "2021/01/13", "2021/01/14", "2021/01/15", "2021/01/16", "2021/01/17", "2021/01/18", "2021/01/19", "2021/01/20", "2021/01/21", "2021/01/22", "2021/01/23", "2021/01/24", "2021/01/25", "2021/01/26", "2021/01/27", "2021/01/28", "2021/01/29"]
// 此處為處理x軸值向中間靠攏谆趾,且不被截?cái)啵?qǐng)不要隨意修改空格個(gè)數(shù)
dateList[0] = '                 ' + dateList[0];
dateList[dateList.length - 1] = dateList[dateList.length - 1] + '                   ';
// 準(zhǔn)備數(shù)值數(shù)據(jù)
let dataList= ["109.34", "109.35", "109.36", "109.37", "109.38", "109.39", "109.40", "109.41", "109.42", "109.42", "109.43", "109.44", "109.44", "109.45", "109.46", "109.47", "109.48", "109.49", "109.50", "109.50", "109.51", "109.52", "109.53", "109.54", "109.55", "109.55", "109.49"]
// let dataList= ["10.934", "10.935", "10.936", "10.937", "10.938", "10.939", "10.940", "10.941", "10.942", "10.942", "10.943", "10.944", "10.944", "10.945", "10.946", "10.947", "10.948", "10.949", "10.950", "10.950", "10.951", "10.952", "10.953", "10.954", "10.955", "10.955", "10.949"]
// let dataList= ["0.10934", "0.10935", "0.10936", "0.10937", "0.10938", "0.10939", "0.10940", "0.10941", "0.10942", "0.10942", "0.10943", "0.10944", "0.10944", "0.10945", "0.10946", "0.10947", "0.10948", "0.10949", "0.10950", "0.10950", "0.10951", "0.10952", "0.10953", "0.10954", "0.10955", "0.10955", "0.10949"]
// 計(jì)算數(shù)據(jù)最大值和最小值
let minValue = '0'
let maxValue = '0'
let list = dataList.filter(item => (item && item != 'null' && item != 'NaN'))
let precision = 10000 //精度
maxValue = Math.ceil(Math.max.apply(null, list) * precision) / precision;
minValue = Math.floor(Math.min.apply(null, list) * precision) / precision;
// 計(jì)算間隔叛本,返回y軸最大值棺妓,y軸最小值 ,間隔
let getLeftData = (min, max) => {
    // 控制分隔條數(shù)炮赦,
    let diff = max - min
    return {
      max: max + diff,
      min: min - diff,
      // 分割成5等份 
      interval: (max + diff - (min - diff)) / 5,
    };
}
let interObj = getLeftData(minValue, maxValue)

option = {
    xAxis: {
        type: 'category',
        data:dateList,
         axisLabel: {
          // 此處為處理x軸值只顯示第一個(gè)和最后一個(gè)日期
          interval: dateList.length - 2,
          textStyle: {
            color: '#999',//坐標(biāo)值得具體的顏色

          }
        },
        axisLine: {
          show: false,//x軸線隱藏
          fontSize: 12,
        },
        axisTick: {
          show: false,//隱藏x軸的標(biāo)點(diǎn)
        },
    },
    yAxis: {
        type: 'value',
        // 設(shè)置y軸間隔
        interval:interObj.interval,
        // 設(shè)置y軸最大值
        min: interObj.min,
        // 設(shè)置y軸最小值
        max: interObj.max,
        axisLabel: {
          textStyle: {
            color: '#999',
          },
          interval: 'auto',
          formatter: function (value, index) {
           return value.toFixed(2) + '%';
          }
        },
        // 顯示分隔線
        splitLine: {
          show: true,
          lineStyle: {
            color: ['#ccc'],
            width: 1,
            type: 'solid'
          }
        },
    },
    series: [{
        data: dataList,
        type: 'line',
        symbol: 'circle',
        symbolSize: 4,
        itemStyle: {
          color: '#fb563a'
        },
        // 漸變色填充
        areaStyle: {
          // origin設(shè)置填充起始位置怜跑,auto默認(rèn)y=0開始,start則從min處開始
          origin: 'start',
          color: {
            type: 'linear',
            x: 0,
            y: 0,
            x2: 0,
            y2: 1,
            colorStops: [{
              offset: 0, color: '#fb563a' // 0% 處的顏色
            }, {
              offset: 1, color: '#fff' // 100% 處的顏色
            }],
            global: false // 缺省為 false
          }
        }
    }]
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吠勘,隨后出現(xiàn)的幾起案子性芬,更是在濱河造成了極大的恐慌,老刑警劉巖剧防,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件植锉,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡峭拘,警方通過查閱死者的電腦和手機(jī)俊庇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門狮暑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辉饱,你說我怎么就攤上這事搬男。” “怎么了彭沼?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵缔逛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我姓惑,道長(zhǎng)褐奴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任于毙,我火速辦了婚禮敦冬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘唯沮。我一直安慰自己脖旱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布烂翰。 她就那樣靜靜地躺著夯缺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪甘耿。 梳的紋絲不亂的頭發(fā)上踊兜,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音佳恬,去河邊找鬼捏境。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毁葱,可吹牛的內(nèi)容都是我干的垫言。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼倾剿,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼筷频!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起前痘,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤凛捏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后芹缔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坯癣,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年最欠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了示罗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惩猫。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚜点,靈堂內(nèi)的尸體忽然破棺而出轧房,到底是詐尸還是另有隱情,我是刑警寧澤禽额,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布锯厢,位于F島的核電站皮官,受9級(jí)特大地震影響脯倒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捺氢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一藻丢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摄乒,春花似錦悠反、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拭荤,卻和暖如春茵臭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舅世。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工旦委, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雏亚。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓缨硝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親罢低。 傳聞我的和親對(duì)象是個(gè)殘疾皇子查辩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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