应用场景(以Echarts柱状图为例):

现有一组数据:最小的数是 50000(5万) ,最大的数是 3000000000(30亿)

如果按照Echarts正常的画法,我们只需提取出来这些数据然后交给Echarts显示即可。

  • 但是这样做面临的问题就很明显——由于数值差距过大,且Echarts本身Y轴的数值是均匀分布的,所以在图里造成的结果是这样的:

在图中,y 轴的数值均匀分布,最高的柱子在x轴 第五值为30亿,但是x轴 第一值为5万的柱子,根本看不见,因为差距太大了,包括x轴 第二值为500万的轴,我们也是只能看到一点点红色。

为了要显示出来小一点的值,我们期望的 y 轴排列应该是这样的:

0    10万    100万     1千万    1亿     10亿       20亿      30亿

这样的数值分布规则就完美符合我们的要求。
所以,我们要做的就是打破 y 轴均匀显示的规则(本质上并没有)。

打破规则

思想

针对这种数值大的数据,我们不免会怀念小数值的好处:

  • 比如把上面的数据都更换成小于等于100的数,那么显示起来就毫无问题了,即便数值只有10,但是在最大值是100的图里,也能正常显示。

所以,打破规则用到的思想就是缩小数据体量

  • 上图中,Echarts本身处理的数据间隔是 5亿,这样分跟我们 x轴的设置也有关系,x 轴一共 5 个分部,给的数值里最大30亿,所以分布在 y 轴上以 5亿 为间隔刚刚好。
  • 如果最大值是 100,那么就会以20为间隔。

那么,我们能不能把上面数据里上亿的数值按照一定的规则让其变成 很小的数据来在图里展示呢?

答案是可以的。

方法

这里可以算是对我在Echarts Gallery 上发布的一个不均匀数据轴图表代码的讲解了。

直达连接:投资计划——不均匀数据轴(y)

首先我们看一组数据:

// 数据源
const sourceData = [{date: '2020-01-01',amount: 1000000},{date: '2020-02-01',amount: 100000},{date: '2020-03-01',amount: 200000},{date: '2020-04-01',amount: 50000 // 很小的数值},{date: '2020-05-01',amount: 20000000},{date: '2020-06-01',amount: 300000000},{date: '2020-07-01',amount: 400000},{date: '2020-08-01',amount: 3000000000 // 很大的数值},{date: '2020-09-01',amount: 550000},
];

这一组数据里,最大值是 30亿 最小值是 5万。我们怎么处理数据呢?

  1. 第一步:设置数据间隔。

    // 间隔(0——30亿)
    // 0    10万    100万     1千万    1亿     10亿       20亿      30亿
    const dataInterval = [0, 100000, 1000000, 10000000, 100000000, 1000000000, 2000000000, 3000000000];
    

    可以理解为我们以自己的想法对 0 到 30亿 的数据 划分了显示的间隔。

  2. 第二步:按照间隔处理数据。

    const investAmount = sourceData.map(item => {const amount = item.amount;// 寻找在数据间隔里小于amount的最大值const min_v = Math.max(...dataInterval.filter(v => v <= amount));// 寻找在数据间隔里大于amount的最小值const max_v = Math.min(...dataInterval.filter(v => v > amount));// 寻找 min_v 所在的下标const index = dataInterval.findIndex(v => v === min_v);// 计算该amount在y轴上应该展示的位置const y_value = (((amount - min_v) / (max_v - min_v)) * 10) + index * 10;return {value: y_value,realValue: amount,date: item.date};
    }).filter(x => x);
    

    代码解释:

    • 首先遍历数据源,取出 amount (数据)。

    • 然后去定义的数据间隔里找 amount 处在间隔的哪两个数据之间。

      min_v:在定义的间隔里找到 所有小于 amount 数值 中的 最大值。

      max_v:在定义的间隔里找到 所有大于 amount 数值中的 最小值。

      如果上面说的不是很明白,我换一种说法:

      把 amount 放到定义的 数据间隔 里进行排序,然后 min_v 和 max_v 就数据间隔里是 amount 左右两侧的值。

      当然代码里是没有真的排序找,而是用了其他的方法而已。

    • 接着需要寻找 min_v 所在的值的下标 i ,然后让其 乘以10 得到一个 index。

    • 最后利用 amount 和 min_v 的差 除以 max_v 和 min_v 的差 乘以 10 加上index 即可。

    • 这是我们就得到了一个按照一定规则缩小的数值。

    • 图例:

    • 上图中得到的结果是:31.111... ,看了这个图应该就明白了,按照上面我讲的,如果把每一个数据都按照这个公式带入算一遍,那么我们就可以把上亿的数转换成几十,而此时得到的Echarts图,将会是一个介于 0 — 70 之间的图,这样就可以把很小的数值也显示出来。

  3. 第三步:渲染数据

    这一步最主要的地方是当用户鼠标放到图上时我们肯定不能显示我们处理过后的数,所以要 formatter 一下:

    tooltip: {show: true,trigger: 'axis',axisPointer: {type: 'shadow'},formatter: (v) => {const date = v[0].data.date;// 前面处理数据时,构造的数组里包含了未处理过的原始值,所以这里直接用即可const value = v[0].data.realValue;return `<div><span>日期:${date}</span><br><span>金额:${value / 10000}(万)</span></div>`}
    }
    

现在你可能就明白了,为什么我前面说 本质上并没有打破均匀显示规则 表面上看确实改变了,但实际y轴依然是均匀分布的数值,不过我们改变了表象,转换了数据而已。

OK, 关于怎么构造一个不均匀数据轴图表我已经介绍完了。大家可以直接去看发布的图表。前面已经提供了链接。

完结·撒花

Echarts绘制不均匀数据轴(y)相关推荐

  1. ECharts 折线图柱状图混合双Y轴 利用ajax动态获取后台数据

    效果图示如下 后台代码用的框架是SSM 双Y轴根据后台数据展示 大致代码如下: List<Map> findqushi(@Param("date_id") String ...

  2. ECharts 多个y轴时使用series.yAxisIndex给数据指定y轴

    1 使用详解 yAxisIndex 说明:使用的 y 轴 的 index,在单个图表实例中存在多个 y轴的时候有用. 默认值:0. 参数类型:number. 2 原始效果图 3 实现代码(给数据指定y ...

  3. echarts 三种数据双y轴显示 (文末附带完整代码)

    说明:网络引用echarts.js和直接下载echarts引用的样式可能会不一致,需要对折线的样式和字体进行修改的请参考我的另外一篇文章https://blog.csdn.net/Wangwangwa ...

  4. Echarts图表设置x轴y轴均随滚轮滚动缩+放 区域缩放

    文章目录 echarts中设置x轴和y轴均随滚轮进行缩放 当数据实时渲染时,也可进行区域缩放 echarts中设置x轴和y轴均随滚轮进行缩放 dataZoom 组件 用于区域缩放,从而能自由关注细节的 ...

  5. ECharts动态加载数据绘制折线图

    Echarts动态加载数据绘制折线图 ECharts 引入ECharts 步骤 连接数据接口,动态加载图表 动态加载数据,整体代码 折线图绘制 总结 绘制多个图表的方法 ECharts 纯Javasc ...

  6. 如何使用MatPlotLib绘制出具有两个 Y 轴的曲线图?

    简 介: 本文给出了利用Matplotlib中的 twinx() 完成同一个图表中绘制具有两个 Y-轴的曲线.绘制每一个曲线的方法与普通的Plot没有什么两样. 关键词: matplotlib,双Y轴 ...

  7. 没数据时y轴不显示_Matplotlib数据可视化

    1.Matplotlib介绍 什么是Matplotlib Matplotlib是一个Python的绘图库,它可与 NumPy 一起使用,可以代替M Matplotlib安装 由于Matplotlib是 ...

  8. Echarts实现多个x轴或y轴曲线图

    Echarts实现多个x轴或y轴曲线图 效果图如下: 1.1 配置option对象 option:{// 设置 x 轴的样式xAxis:{},// 设置 y 轴的样式yAxis:[],// 设置每条曲 ...

  9. MATLAB绘制多组数据的双轴、三轴、四轴图

    目录 引言 Yaxis2:绘制2组数据的双轴图 Yaxis2N:绘制N组数据的双轴图 Yaxis3:绘制3组数据的三轴图 Yaxis3N:绘制N组数据的三轴图 Yaxis4:绘制4组数据的四轴图 Ya ...

最新文章

  1. 道理我都懂,但是神经网络反向传播时的梯度到底怎么求?
  2. 感觉要火!妹子实地采访网易猪厂程序员七夕怎么过
  3. Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程
  4. 中科院博士整理的机器学习算法知识手册,完整 PDF 开放下载!
  5. MySQL.. ERROR! The server quit without updating PID file问题解决
  6. python状态码及其含义_Shell退出状态码及其应用详解
  7. python入门——P39类和对象:拾遗
  8. 第5章 set命令详解
  9. 汉字计算机编码是谁发明的,神奇的汉字编码,了解一下
  10. 苹果手机添加 qq 邮箱的方法
  11. 解决MAC删除应用程序后依然残留的图标
  12. RHEL服务篇_DNS服务
  13. MFC与Windows编程
  14. 抬杠计算机,全 自 动 抬 杠 机
  15. ubuntu慢?如何给 ubuntu 换源 提速
  16. hibernate一对一主键唯一外键关联(一)
  17. 经典进程同步与互斥问题
  18. 阿里云携手爱迪德,发布中国首个云端DRM解决方案
  19. 解决:为什么谷歌浏览器启动主页是360导航,自己明明设置的是百度?
  20. 如何把光遇android和平切换成ios,光遇安卓和ios互通教程 安卓和ios互通注意事项...

热门文章

  1. to 管理员:网站的“技术区文章列表RSS”有问题 我用GUSH连不上!
  2. 计算机在机械设制造中的应用实例,机械设计与制造毕业设计一体化分析
  3. [CODEVS3032]摆放球 解题报告
  4. STM32开发项目:STM32F407的BootLoader程序
  5. Atollic TrueSTDIO下修改STM32L475VE的变量分配地址
  6. [MySQL进阶]——ER模型
  7. MYSQLWorkbench看数据库ER图
  8. SpringBoot集成alipay-easysdk
  9. 当你收到面试通知后,通过如下的准备可以大大提升面试成功率
  10. Windows CE下的网络监测工具(上)