echarts处理y轴最大小值根据数据动态处理、分割数和是否从0开始

方法

javascript 复制代码
/**
 * 取整
 * @param value 输入值
 * @param scale 保留位数 正数是整数位,负数是小数位
 * @param isUpper true 向上取整  false向下取整
 * @returns
 */
const numberFix = (value, scale, isUpper) => {
    const moreThanZero = value >= 0
    value = Math.abs(value)
    if (scale == 0) {
      return value
    }
    if (scale > 0) {
      scale -= 1
    }
    let result
    if (moreThanZero) {
      result =
        numberFloorOrCeil(value / Math.pow(10, scale), isUpper) *
        Math.pow(10, scale)
    } else {
      result =
        -1 *
        numberFloorOrCeil(value / Math.pow(10, scale), !isUpper) *
        Math.pow(10, scale)
    }
    if (scale < 0) {
      result =
        numberFloorOrCeil(result * Math.pow(10, -1 * scale), isUpper) /
        Math.pow(10, -1 * scale)
    }
    return result
  }
  
  const numberFloorOrCeil = (value, isUpper) => {
    if (isUpper) {
      return Math.ceil(value)
    } else {
      return Math.floor(value)
    }
  }
  
  /**
   * 得到数字的尺寸
   * 0=>1
   * 5=>1
   * 10=>2
   * 123=>3
   * 0.5=>-1
   * 0.003=>-3
   * @param value
   * @returns {number}
   */
  const getNumberMaxScale = value => {
    const moreThanZero = value >= 0
    let absValue = Math.abs(value)
    if (absValue >= 1) {
      const valueStr = absValue + ''
      return valueStr.split('.')[0].length
    } else if (absValue > 0) {
      let scale = 0
      while (absValue < 1) {
        absValue *= 10
        scale -= 1
      }
      return scale
    } else {
      // 为0
      return 1
    }
  }
  
  /**
   *
   * @param valueArr 对象数组
   * @param splitNum 分割线数量
   * @param fromZero 是否从0开始
   * @param splitSmallerScale 分割数取整减少位数
   * @param splitMinScale 1是个位 2是10位,-1表示0.1级别,-2表示0.01级别,-3表示0.001级别; null就是不启用这个功能
   * @returns {{min: number, max: number, interval: number}}
   */
  const echartsSplit = (
    valueArr,
    splitNum = 5,
    fromZero = true,
    splitSmallerScale = 0,
    splitMinScale = null
  ) => {
    valueArr = [...valueArr]
    if (fromZero) {
      valueArr.push(0)
    }
    let maxValue = Math.max(...valueArr)
    let minValue = Math.min(...valueArr)
  
    const maxMoreThanZero = maxValue >= 0
    const minMoreThanZero = minValue >= 0
    let totalDiff = maxValue - minValue
    let totalDiffScale = getNumberMaxScale(totalDiff / splitNum)
    let splitScale = totalDiffScale - splitSmallerScale
    if (splitMinScale != null && splitScale < splitMinScale) {
      splitScale = splitMinScale
    }
    splitScale = splitScale == 0 ? -1 : splitScale
    let minResult = numberFix(minValue, splitScale, false)
    let splitValue = (maxValue - minResult) / splitNum
    let splitResult = numberFix(splitValue, splitScale, true)
    // 如果所有数据值都一样的特殊情况处理
    if (splitResult == 0) {
      // 如果所有数据都一样且都为0,则最小值为0
      minResult = minResult == 0 ? 0 : minResult - 1
      splitResult = 1
    }
    let maxResult = minResult + splitResult * splitNum
  
    return {
      min: Math.round(minResult * 100000000) / 100000000,
      max: Math.round(maxResult * 100000000) / 100000000,
      interval: Math.round(splitResult * 100000000) / 100000000
    }
  }
  export default echartsSplit
  

使用

javascript 复制代码
import echartsSplit from '@/utils/echartsSplit'

setOptions(list) {
	  const wData = []
      const qData = []
      const drpData = []
      series.forEach((item) => {
        if (item.name.indexOf('流量') > -1) {
          qData.push(...item.data.filter((value) => value))
        } else if (item.name.indexOf('水位') > -1) {
          wData.push(...item.data.filter((value) => value))
        } else {
          drpData.push(...item.data.filter((value) => value))
        }
      })
      this.options.yAxis = yAxis.map((item, index) => {
        const data = index === 0 ? drpData : index === 1 ? wData : qData
        const obj = echartsSplit(data, 5, false)
        return {
          ...item,
          min: obj.min,
          max: obj.max,
          interval: obj.interval
        }
      })
      this.options = { ...this.options }
}

效果

相关推荐
jin12332222 分钟前
基于React Native鸿蒙跨平台地址管理是许多电商、外卖、物流等应用的重要功能模块,实现了地址的添加、编辑、删除和设置默认等功能
javascript·react native·react.js·ecmascript·harmonyos
2501_9209317041 分钟前
React Native鸿蒙跨平台医疗健康类的血压记录,包括收缩压、舒张压、心率、日期、时间、备注和状态
javascript·react native·react.js·ecmascript·harmonyos
橙露2 小时前
React Hooks 深度解析:从基础使用到自定义 Hooks 的封装技巧
javascript·react.js·ecmascript
2501_920931702 小时前
React Native鸿蒙跨平台使用useState管理健康记录和过滤状态,支持多种健康数据类型(血压、体重等)并实现按类型过滤功能
javascript·react native·react.js·ecmascript·harmonyos
Ulyanov2 小时前
从静态到沉浸:打造惊艳的Web技术发展历程3D时间轴
前端·javascript·html5·gui开发
VT.馒头2 小时前
【力扣】2625. 扁平化嵌套数组
前端·javascript·算法·leetcode·职场和发展·typescript
毎天要喝八杯水3 小时前
搭建vue前端后端环境
前端·javascript·vue.js
雨季6664 小时前
Flutter 三端应用实战:OpenHarmony “极简手势轨迹球”——指尖与屏幕的诗意对话
开发语言·javascript·flutter
摘星编程5 小时前
OpenHarmony环境下React Native:Tooltip自动定位
javascript·react native·react.js
穿过锁扣的风5 小时前
如何操作HTML网页
前端·javascript·html