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

UChart图标 y轴取整

目录

Uchart y轴取整

思路

1. 核心逻辑:向上取整到最近的 5 的倍数

2. 为什么这样设计?

3. 示例验证

4. 注意事项

5. 总结


Uchart y轴取整

由于max最大值的约束自动计算的会出现小数

针对需要y轴显示整数的情况,如显示次数,文章提出了一种策略。首先确定y轴的最大值为数据中的最大值,然后将这个最大值调整为最接近的5的倍数,确保y轴刻度为整数且能完整包含所有数据

一些数据需要y轴为整数,比如y轴数据为次数 

思路

y轴设置分为n段,调整y轴最大值为与数据最大相近的n的倍数

 

let seriesData = newData.series || [];const ArrayData = seriesData.reduce((acc, curr) => acc.concat(curr?.data || []),[]);    const yMaxData = Math.max(...ArrayData) || 0; //数据中的最大值// 3 % 5 = 3 → 5 - 3 = 2 → 3 + 2 = 5// const max = yMaxData + 5 - (yMaxData % 5); // 多留 5 单位空间// Math.ceil(10 / 5) * 5 = 10  ceil 大于等于 x 的最小整数。const max = Math.ceil(yMaxData / 5) * 5; // 无额外空间that.setData({["opts.yAxis.data[0].max"]: max,});

这个表达式 chartOpt.yAxis.data[0].max = yMaxData + 5 - yMaxData % 5 的目的是为了将 Y 轴的最大值(max)设置为一个 大于数据最大值(yMaxData)且是 5 的倍数 的“整齐”数值。以下是详细解释:

1. 核心逻辑:向上取整到最近的 5 的倍数

  • yMaxData % 5:计算 yMaxData 除以 5 的余数(结果范围是 0 到 4)。

  • 5 - (yMaxData % 5):计算距离下一个 5 的倍数还差多少(如果余数是 0,结果为 5;余数是 1,结果为 4;以此类推)。

  • yMaxData + (5 - yMaxData % 5):将当前数据最大值 yMaxData 向上“补齐”到下一个 5 的倍数。

2. 为什么这样设计?

  • 确保 Y 轴最大值略大于数据最大值
    图表需要留出一定的视觉缓冲空间,避免数据点(如柱状图顶部)紧贴坐标轴边界。表达式确保 max > yMaxData

  • 生成“整齐”的刻度值
    5 的倍数(如 0, 5, 10, 15...)作为坐标轴刻度更易读,比任意数值(如 12, 17, 23)更直观。

  • 动态适应数据变化
    无论 yMaxData 是多少,表达式都能自动计算下一个合适的 5 的倍数。

3. 示例验证

yMaxData计算步骤结果 (max)
1212 % 5 = 2 → 5 - 2 = 3 → 12 + 3 = 1515
1717 % 5 = 2 → 5 - 2 = 3 → 17 + 3 = 2020
1010 % 5 = 0 → 5 - 0 = 5 → 10 + 5 = 1515
33 % 5 = 3 → 5 - 3 = 2 → 3 + 2 = 55

4. 注意事项

  • 当 yMaxData 已是 5 的倍数时(如 10),结果会是 yMaxData + 5(即 15)。这刻意多留了 5 单位的空间,避免数据紧贴边界。

  • 替代写法
    可用更简洁的 Math.ceil(yMaxData / 5) * 5 实现相同效果,但需注意两者在边界行为的差异:

    // 当 yMaxData=10 时:
    Math.ceil(10 / 5) * 5 = 10; // 无额外空间
    yMaxData + 5 - (10 % 5) = 15; // 多留 5 单位空间

    原表达式优先保证留出空间,而 Math.ceil 可能让数据贴边(需额外处理)。

5. 总结

此表达式通过 取余和补差 确保 Y 轴最大值满足:

  1. 是 5 的倍数(刻度整齐)。

  2. 严格大于数据最大值(预留视觉空间)。

  3. 适应任意数据动态变化。

这是数据可视化中优化坐标轴刻度的常见技巧。

http://www.xdnf.cn/news/910531.html

相关文章:

  • [蓝桥杯]扫地机器人
  • 如何在Lyra中创建一个新的Game Feature Plugin和Experience游戏体验
  • 区分viewmodel和model职责的方法
  • 六级作文--句型
  • Mysql中select查询语句的执行过程
  • 浩辰AI楼梯让建筑设计智能化!
  • mysql修改字段类型
  • 手撕定时任务
  • mamba架构和transformer区别
  • 制作电子相册
  • 【深度学习新浪潮】RoPE对大模型的外推性有什么影响?
  • Gojs渲染实线、虚线
  • 单周期cpu和多周期cpu、单周期数据通路和多周期数据通路与总线结构数据通路和专用数据通路的关系
  • JAVA学习 DAY2 java程序运行、注意事项、转义字符
  • 实现echarts全屏的放大/缩小最优解
  • Kyosan K5BMC ELECTRONIC INTERLOCKING MANUAL 电子联锁
  • 【PmHub面试篇】性能监控与分布式追踪利器Skywalking面试专题分析
  • pp-ocrv5改进
  • 核弹级漏洞深度解析:Log4j2 JNDI注入攻击原理与防御实战
  • [IMX][UBoot] 01.UBoot 常用命令
  • 【八股消消乐】MySQL参数优化大汇总
  • 使用 Python 和 HuggingFace Transformers 进行对象检测
  • xpath表达式的常用知识点
  • K7 系列各种PCIE IP核的对比
  • 每日算法 -【Swift 算法】电话号码字母组合
  • Keil调试模式下,排查程序崩溃简述
  • 六、【ESP32开发全栈指南:深入解析ESP32 IDF中的WiFi AP模式开发】
  • 读《创新者的窘境》二分 - 破坏性创新与延续性创新
  • 飞牛使用Docker部署Tailscale 内网穿透教程
  • KL散度计算示例:用户画像 vs. 专辑播放分布的性别偏好分析