当前位置: 首页 > news >正文

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

方法

/*** 取整* @param value 输入值* @param scale 保留位数 正数是整数位,负数是小数位* @param isUpper true 向上取整  false向下取整* @returns*/
const numberFix = (value, scale, isUpper) => {const moreThanZero = value >= 0value = Math.abs(value)if (scale == 0) {return value}if (scale > 0) {scale -= 1}let resultif (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 >= 0let absValue = Math.abs(value)if (absValue >= 1) {const valueStr = absValue + ''return valueStr.split('.')[0].length} else if (absValue > 0) {let scale = 0while (absValue < 1) {absValue *= 10scale -= 1}return scale} else {// 为0return 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 >= 0const minMoreThanZero = minValue >= 0let totalDiff = maxValue - minValuelet totalDiffScale = getNumberMaxScale(totalDiff / splitNum)let splitScale = totalDiffScale - splitSmallerScaleif (splitMinScale != null && splitScale < splitMinScale) {splitScale = splitMinScale}splitScale = splitScale == 0 ? -1 : splitScalelet minResult = numberFix(minValue, splitScale, false)let splitValue = (maxValue - minResult) / splitNumlet splitResult = numberFix(splitValue, splitScale, true)// 如果所有数据值都一样的特殊情况处理if (splitResult == 0) {// 如果所有数据都一样且都为0,则最小值为0minResult = minResult == 0 ? 0 : minResult - 1splitResult = 1}let maxResult = minResult + splitResult * splitNumreturn {min: Math.round(minResult * 100000000) / 100000000,max: Math.round(maxResult * 100000000) / 100000000,interval: Math.round(splitResult * 100000000) / 100000000}}export default echartsSplit

使用

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 : qDataconst obj = echartsSplit(data, 5, false)return {...item,min: obj.min,max: obj.max,interval: obj.interval}})this.options = { ...this.options }
}

效果

在这里插入图片描述


http://www.mrgr.cn/news/18085.html

相关文章:

  • Java学习第六天
  • 用相图分析 bbr,inflight 守恒的收敛速度
  • 世界上最快的端口扫描器masscan,如何使用?如何进行分布式使用部署?如何集成到web系统?
  • 【前端 · 面试 】HTTP 总结(九)—— HTTP 协商缓存
  • 2025毕业季:如何用Java SpringBoot构建医疗就诊平台?掌握最新技术,开启医疗信息化大门
  • 盲盒小程序开发,探索市场发展优势
  • 多看书,一年顶十年!(码农必读书单)
  • 多目标应用:基于自组织分群的多目标粒子群优化算法(SS-MOPSO)的移动机器人路径规划研究(提供MATLAB代码)
  • PANDA:免微调提升大模型领域特定能力的新方法
  • C语言典型例题59
  • 嵌入式是用C++还是用C的架构 怎么选?
  • springboot+vue 进销存管理系统
  • 使用 nuxi dev 启动 Nuxt 应用程序的详细指南
  • 笔记:Sysinternals 是什么, 常见的 Sysinternals 工具有哪些
  • 分布式事务Seata
  • python 并发100个请求
  • ANet-1E1S1智能网关:物联网时代的能源计量新纪元,断点续传引领高效运维
  • 基于Video-Retalking-Gradio的AI数字人
  • 什么是短视频矩阵?一个人能做好短视频矩阵营销吗?
  • kafka快速上手