最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript?Echarts柱狀圖label優(yōu)化中問題針對(duì)講解

 更新時(shí)間:2022年12月01日 14:47:14   作者:青春微涼不悲傷  
這篇文章主要介紹了JavaScript?Echarts柱狀圖label優(yōu)化中問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧

問題1

由于項(xiàng)目數(shù)據(jù)記錄多或者數(shù)據(jù)值大的時(shí)候,會(huì)出現(xiàn)label重疊的現(xiàn)象,如下圖。

解決方案

針對(duì)上述問題,解決思路如下:

1、求Y軸的最大值(我們用Y軸的最大值,去計(jì)算每個(gè)柱子在整個(gè)圖中的占比)

2、計(jì)算每個(gè)數(shù)據(jù)的占比

3、占比小于某個(gè)值的label,向上移動(dòng)一定距離

技術(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)步長(zhǎng)不好看,有可能還會(huì)有小數(shù)。

后來使用echarts默認(rèn)的最大值,為上圖第二行。

數(shù)據(jù)的最大值為上圖的第三行。

最大值的步長(zhǎng)為第四行。

默認(rèn)步長(zhǎng)為第五行。

經(jīng)觀察及多次試驗(yàn)發(fā)現(xiàn)步長(zhǎng)可通過如下公式計(jì)算:

// 獲取步長(zhǎng)
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)); // 完成比

移動(dòng)label

通過各數(shù)據(jù)的占比,計(jì)算兩者之間的差值,當(dāng)差距小于n時(shí),讓該值的label向上移動(dòng)。

// 移動(dòng)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,錯(cuò)落顯示
         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í)候,普通柱狀圖的柱子寬度會(huì)自適應(yīng),而象形圖的大小確是固定的,所以會(huì)出現(xiàn)頂部橢圓和柱子寬度不匹配的現(xiàn)象,如下圖

解決方案

根據(jù)數(shù)據(jù)長(zhǎng)度,動(dòng)態(tài)設(shè)置象形圖的大小及偏移位置。

// 不同數(shù)據(jù)長(zhǎng)度對(duì)應(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ù)長(zhǎng)度對(duì)應(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值小的圖形會(huì)被z值大的圖形覆蓋。由于象形圖的z值比柱狀圖的z值大,所以會(huì)把柱狀圖的label值給覆蓋了,如下圖。

解決方案

將label值根據(jù)數(shù)據(jù)的大小動(dòng)態(tài)的顯示到柱狀圖或者象形圖上。

PS:不可以直接顯示到象形圖上,因?yàn)閿?shù)據(jù)值很小的情況只看到了象形圖,所以不顯示象形圖

到此這篇關(guān)于JavaScript Echarts柱狀圖label優(yōu)化中問題針對(duì)講解的文章就介紹到這了,更多相關(guān)JavaScript Echarts柱狀圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • setTimeout內(nèi)不支持jquery的選擇器的解決方案

    setTimeout內(nèi)不支持jquery的選擇器的解決方案

    在JS中無論是setTimeout還是setInterval,在使用函數(shù)名作為調(diào)用句柄時(shí)都不能帶參數(shù),而在許多場(chǎng)合必須要帶參數(shù),這就需要想方法解決。
    2015-04-04
  • async/await實(shí)現(xiàn)Promise.all()的方式

    async/await實(shí)現(xiàn)Promise.all()的方式

    Promise.all() 方法接收一個(gè) promise 的 iterable 類型的輸入,并且只返回一個(gè)Promise實(shí)例,并且輸入的所有 promise 的 resolve 回調(diào)的結(jié)果是一個(gè)數(shù)組,對(duì)async/await實(shí)現(xiàn)Promise.all()相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-12-12
  • JavaScript設(shè)計(jì)模式之命令模式

    JavaScript設(shè)計(jì)模式之命令模式

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式之命令模式,對(duì)設(shè)計(jì)模式感興趣的同學(xué),可以參考下
    2021-04-04
  • 使用canvas繪圖音樂頻譜示例及技術(shù)分析

    使用canvas繪圖音樂頻譜示例及技術(shù)分析

    這篇文章主要為大家介紹了使用canvas實(shí)現(xiàn)音樂頻譜示例及技術(shù)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • JavaScript實(shí)現(xiàn)使用Canvas繪制圖形的基本教程

    JavaScript實(shí)現(xiàn)使用Canvas繪制圖形的基本教程

    本篇文章主要介紹了JavaScript實(shí)現(xiàn)使用Canvas繪制圖形的基本教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-10-10
  • ES7中利用Await減少回調(diào)嵌套的方法詳解

    ES7中利用Await減少回調(diào)嵌套的方法詳解

    大家都知道在ES7中有了標(biāo)準(zhǔn)的回調(diào)函數(shù)嵌套的解決方案,新增了 async/await兩個(gè)關(guān)鍵詞,所以這篇文章主要給大家介紹了關(guān)于Javascript中如何利用Await減少回調(diào)嵌套的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • JavaScript常用的3種彈出框(提示框?alert/確認(rèn)框?confirm/輸入框?prompt)

    JavaScript常用的3種彈出框(提示框?alert/確認(rèn)框?confirm/輸入框?prompt)

    三種彈框在系統(tǒng)中都是同步執(zhí)行的,也就是說,三種彈框中的任一彈框彈出,代碼都不在執(zhí)行,直到點(diǎn)擊確認(rèn)或取消,關(guān)閉彈窗后,代碼繼續(xù)執(zhí)行,本文通過實(shí)例代碼給大家分享JS常用的3種彈出框,感興趣的朋友一起看看吧
    2022-07-07
  • 再談javascript注入 黑客必備!

    再談javascript注入 黑客必備!

    這篇文章主要為大家詳細(xì)介紹了js注入,黑客之路必備!本文告訴大家js注入是什么,js注入攻防如何進(jìn)行,感興趣的小伙伴們可以參考一下
    2016-09-09
  • JavaScript替換當(dāng)前頁面的方法

    JavaScript替換當(dāng)前頁面的方法

    這篇文章主要介紹了JavaScript替換當(dāng)前頁面的方法,涉及javascript中replace方法的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 8個(gè)鮮為人知但很實(shí)用的Web?API用法總結(jié)

    8個(gè)鮮為人知但很實(shí)用的Web?API用法總結(jié)

    在?Web?API?中,有非常有用的對(duì)象、屬性和函數(shù)可用于執(zhí)行小到訪問?DOM?這樣的小任務(wù),大到處理音頻、視頻這樣的復(fù)雜任務(wù)。下面就帶大家一起來看看一些不常見但很實(shí)用的Web?API的用法
    2022-08-08

最新評(píng)論

西华县| 广西| 陇西县| 衡阳市| 昭通市| 抚顺市| 桓台县| 阜宁县| 图片| 卫辉市| 华宁县| 祁连县| 仁寿县| 崇文区| 广元市| 民权县| 新巴尔虎右旗| 武穴市| 济源市| 婺源县| 凉城县| 城固县| 项城市| 焉耆| 沙雅县| 肥西县| 武乡县| 申扎县| 醴陵市| 东海县| 通州区| 洞头县| 怀化市| 浑源县| 蒲江县| 夏津县| 大关县| 遵化市| 五大连池市| 海盐县| 自治县|