JavaScript?Echarts柱狀圖label優(yōu)化中問題針對講解
問題1
由于項(xiàng)目數(shù)據(jù)記錄多或者數(shù)據(jù)值大的時(shí)候,會出現(xiàn)label重疊的現(xiàn)象,如下圖。
解決方案
針對上述問題,解決思路如下:
1、求Y軸的最大值(我們用Y軸的最大值,去計(jì)算每個(gè)柱子在整個(gè)圖中的占比)
2、計(jì)算每個(gè)數(shù)據(jù)的占比
3、占比小于某個(gè)值的label,向上移動一定距離
技術(shù)實(shí)現(xiàn)
求Y軸的最大值
由上圖可知,我們有計(jì)劃值、完成值兩組數(shù)據(jù),且這兩組值共用一個(gè)Y軸。
上圖為觀察的5組數(shù)據(jù)的值。
echarts默認(rèn)分割段數(shù)為5,為了計(jì)算最大值,我們還默認(rèn)為5。剛開始從網(wǎng)上找了一個(gè)求最大值的公式,計(jì)算后如上圖的第一行,發(fā)現(xiàn)步長不好看,有可能還會有小數(shù)。
后來使用echarts默認(rèn)的最大值,為上圖第二行。
數(shù)據(jù)的最大值為上圖的第三行。
最大值的步長為第四行。
默認(rèn)步長為第五行。
經(jīng)觀察及多次試驗(yàn)發(fā)現(xiàn)步長可通過如下公式計(jì)算:
// 獲取步長 const getStep = (value, count) => { // count是計(jì)算的層數(shù) let num = Math.ceil(value / 10); return num > 15 ? getStep(num, count + 1) : num * Math.pow(10, count); } // 求最大值 let stepVal = getStep(_.max(dataList) / 5, 1); // dataList - 計(jì)劃值、完成值組成的數(shù)組 maxVal = stepVal * 5;
計(jì)算每個(gè)數(shù)據(jù)的占比
經(jīng)上步可計(jì)算出每個(gè)數(shù)據(jù)在整個(gè)圖中的占比。
let planRatio = parseFloat((plan / maxVal * 100).toFixed(2)); // 計(jì)劃比 let nowRatio = parseFloat((now / maxVal * 100).toFixed(2)); // 完成比
移動label
通過各數(shù)據(jù)的占比,計(jì)算兩者之間的差值,當(dāng)差距小于n時(shí),讓該值的label向上移動。
// 移動label data1.forEach((item, index) => { let planRatio = parseFloat((item / maxVal * 100).toFixed(2)); // 計(jì)劃比 let nowRatio = parseFloat((data2[index] / maxVal * 100).toFixed(2)); // 完成比 let nowVal; if (data2[index] === 0) { nowVal = data2[index]; } else { // 兩個(gè)比值小于5,錯落顯示 nowVal = Math.abs(nowRatio - planRatio) < 4 ? {value: data2[index], label: {offset: [0, -20]}} : data2[index]; } option.series[0].data.push(item); option.series[1].data.push(nowVal); })
最終效果圖
問題2
為了視覺上更直觀,客戶要求將平面柱狀圖改成立體柱狀圖,效果如下。
思路
普通柱狀圖(bar)+ 象形柱圖(pictorialBar)
難點(diǎn)1
由于數(shù)據(jù)是不固定的,所以當(dāng)數(shù)據(jù)量大的時(shí)候,普通柱狀圖的柱子寬度會自適應(yīng),而象形圖的大小確是固定的,所以會出現(xiàn)頂部橢圓和柱子寬度不匹配的現(xiàn)象,如下圖
解決方案
根據(jù)數(shù)據(jù)長度,動態(tài)設(shè)置象形圖的大小及偏移位置。
// 不同數(shù)據(jù)長度對應(yīng)不同柱子寬度 const getSymbolSize = () => { let len = dataName.length; switch (len) { case 6: return [24, 10]; case 7: return [20, 8]; case 8: return [18, 8]; default: return [24, 10]; } } // 不同數(shù)據(jù)長度對應(yīng)不同柱子偏移 const getSymbolOffset = (i) => { let len = dataName.length; switch (len) { case 6: return i === 2 ? [-12, -6] : [12, -6]; case 7: return i === 2 ? [-11, -5] : [11, -5]; case 8: return i == 2 ? [-9, -5] : [9, -5]; default: return i === 2 ? [-12, -6] : [12, -6]; } }
難點(diǎn)2
在echarts圖中,z
值控制圖形的前后順序。z
值小的圖形會被z
值大的圖形覆蓋。由于象形圖的z值比柱狀圖的z值大,所以會把柱狀圖的label值給覆蓋了,如下圖。
解決方案
將label值根據(jù)數(shù)據(jù)的大小動態(tài)的顯示到柱狀圖或者象形圖上。
PS:不可以直接顯示到象形圖上,因?yàn)閿?shù)據(jù)值很小的情況只看到了象形圖,所以不顯示象形圖
到此這篇關(guān)于JavaScript Echarts柱狀圖label優(yōu)化中問題針對講解的文章就介紹到這了,更多相關(guān)JavaScript Echarts柱狀圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ES6中Set和Map數(shù)據(jù)結(jié)構(gòu),Map與其它數(shù)據(jù)結(jié)構(gòu)互相轉(zhuǎn)換操作實(shí)例詳解
這篇文章主要介紹了ES6中Set和Map數(shù)據(jù)結(jié)構(gòu),Map與其它數(shù)據(jù)結(jié)構(gòu)互相轉(zhuǎn)換操作,結(jié)合實(shí)例形式詳細(xì)分析了ES6中的Set和Map數(shù)據(jù)結(jié)構(gòu)的概念、原理、遍歷、去重等操作,以及Map與其它數(shù)據(jù)結(jié)構(gòu)互相轉(zhuǎn)換操作,需要的朋友可以參考下2019-02-02javascript字符串替換函數(shù)如何一次性全部替換掉
這篇文章主要介紹了JS字符串替換函數(shù)replace如何一次性全部替換的相關(guān)資料,需要的朋友可以參考下2015-10-10詳解如何使用webpack打包多頁jquery項(xiàng)目
這篇文章主要介紹了詳解如何使用webpack打包多頁jquery項(xiàng)目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02