echarts解决数据差异过大的问题

问题描述
使用echarts折线图和柱状图展示数据时,如果数据差异值较大,会导致显示图形差异过大,图表不美观。
如这一组数据[2000000, 200, 0.1, 20, 0, -10, -3000],渲染出来的效果如下图:
在这里插入图片描述
可以看到由于最大值和最小值差异过大,导致过小的值柱子显示不出来,数据的波动趋势不明显。
当前需要解决的问题是如何体现数据差异性,让小数值柱子也能显示出来。
解决方案:
使用对数轴(yAxis. type=“log”),适用于对数数据,可以解决数据差异过大的问题。但对数轴只适用于data>=0的情况。
如数据:barDatas = [2000000, 200, 0.1, 20, 3,3, 3000]
在这里插入图片描述
如果对数轴中的数组数据出现0或者负数情况,就会造成错误渲染。
在这里插入图片描述
试了很多办法都无法解决这个问题,最后采取了多个grid多轴的办法。

可以通过grid来划分多个网格区域,然后让正数和负数柱状图分别在在不同的区域展现。
如:const barDatas = [2000000, 200, 0.1, 20, 0, -10, -3000]
在这里插入图片描述
流程展示:

  • 将barDatas数组拆分为正数数组,负数数组

  • 设置三个grid,分别为用于展示正数,负数数据,以及底部X轴

  • 正负数数据网格区域y轴为yAxis. type=“log”,X轴网格区数数据区域yAxis. type=“value”

  • 正数柱状图series.data只展示大于0的数据,其余为null(barDatas.map(item => item > 0 ? item : null);
    负数柱状图series.data只展示小于0的数据,并展示为绝对值,其余为null(barDatas.map(item => item < 0 ? Math.abs(item): null)

  • 设置负数的y轴yAxis.inverse=true,让Y轴绕X轴上下翻转,并配置y轴标签显示yAxis.axisLabel.formatter=(val) => val === 1 ? 0 : -${val}

其中要解决的问题是:
1)解决起始0对齐的问题
在这里插入图片描述
因为对数轴的数据不能为0,所以需要设置上下yAxis的min为1,再通过yAxis.axisLabel.formatter将y轴的1改为0。
在这里插入图片描述
2)小于1的数据柱子无高度。
在这里插入图片描述
需要设置barMinHeight最小高度,同时改造小于1的数为1.01

这种方式能很好的解决数据差异过大的问题。
代码附上:

<!DOCTYPE html>
<html lang="en" style="height: 100%">

<head>
    <meta charset="utf-8">
</head>
<script type="text/javascript" src="https://registry.npmmirror.com/echarts/5.5.0/files/dist/echarts.min.js"></script>

<body style="height: 100%; margin: 0">
    <div id="container" style="width: 50%;height: 50%;border: 1px solid red;margin: 30px;"></div>
    <script type="text/javascript">
        var dom = document.getElementById('container');
        var myChart = echarts.init(dom, null, {
            renderer: 'canvas',
            useDirtyRect: false
        });
        var app = {};
        var option;
        // const barDatas = [1000000, 20000000, 0.1, 20, 0, -10, -3000];
        // const barDatas = [200000, -100];
        const barDatas = [2000000, 200, 0.1, 20, 0, -10, -3000]
        option = {
            color: ['#3398DB'],
            tooltip: {
                trigger: 'axis',
                axisPointer: {
                    type: 'shadow'
                },
                formatter: (params) => {
                    const { dataIndex } = params[0]
                    return `${`城市${dataIndex + 1}`}${barDatas[dataIndex]}`
                }
            },
            grid: [{
                right: 20,
                left: 80,
                top: 30,
                bottom: '50%',
                containLabel: false,
            }, {
                right: 20,
                left: 80,
                top: '50%',
                bottom: 30,
                containLabel: false,
                show: false
            }, {
                right: 20,
                left: 80,
                top: '50%',
                bottom: 30,
                containLabel: false,
                show: false
            }],
            xAxis: [
                {
                    type: 'category',
                    gridIndex: 0,
                    show: false,
                },
                {
                    type: 'category',
                    show: false,
                    gridIndex: 1,
                },
                {
                    type: 'category',
                    interval: 0,
                    gridIndex: 2,
                    data: barDatas.map((item, index) => `城市${index + 1}`)
                },
            ],
            yAxis: [
                {
                    type: 'log',
                    gridIndex: 0,
                    min: 1, // 设置y轴最小值
                    axisLabel: {
                        formatter: (val) => val === 1 ? 0 : val
                    }
                },
                {
                    type: 'log',
                    gridIndex: 1,
                    inverse: true, //设置反向坐标,让Y轴绕X轴上下翻转
                    min: 1, // 设置y轴最小值
                    axisLabel: {
                        formatter: (val) => val === 1 ? 0 : `-${val}`
                    }
                },
                {
                    type: 'value',
                    gridIndex: 2,
                    show: false,
                },
            ],
            series: [
                {
                    name: '正数',
                    xAxisIndex: 0,
                    yAxisIndex: 0,
                    type: 'bar',
                    data: barDatas.map(item => item > 0 ? item > 1 ? item : 1.01 : null), // 正数柱状图series.data只展示大于0的数据
                    barMinHeight: 1.5,// 最小高度
                },
                {
                    name: '负数',
                    type: 'bar',
                    xAxisIndex: 1,
                    yAxisIndex: 1,
                    data: barDatas.map(item => item < 0 ? Math.abs(item) > 1 ? Math.abs(item) : 1.01 : null), // 负数柱状图eries.data只展示小于0的数据
                    barMinHeight: 1.5, // 最小高度
                },
                {
                    name: 'x轴',
                    xAxisIndex: 2,
                    yAxisIndex: 2,
                    type: 'bar',
                    show: false,
                    data: barDatas.map(item => null),
                },
            ],
        };
        if (option && typeof option === 'object') {
            myChart.setOption(option);
        }
        window.addEventListener('resize', myChart.resize);
    </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/794309.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

netscaler LDAP+RADIUS传统的双因素认证方式(之一)

如果使用传统的双因素认证方式&#xff0c;可以通过在Citrix ADC (NetScaler) 13.1上配置Gateway Virtual Server来实现LDAP和RADIUS的双因素认证。当前配置方式&#xff0c;采用Cateway vServer两个Basic Authtication Policy方式实现&#xff0c;以下是详细步骤&#xff1a; …

【Python】使用PyQt6创建简单的登录界面

使用PyQt6创建简单的登录界面 介绍 PyQt6是Python绑定的Qt库&#xff0c;可以用来开发跨平台的桌面应用程序。本教程将介绍如何使用PyQt6创建一个简单的登录界面&#xff0c;包括用户名和密码输入框以及登录按钮。当用户点击登录按钮时&#xff0c;程序会验证输入的凭据并显示…

Matplotlib入门

#折线图用来表示数据的变化 plt.plot(x,y) #直方图用来统计连续性数据 无间隔 plt.hist(data数组,组数) #条形图用来统计离散的数组 并且反映其变化 有间隔 plt.bar(x,y,width 0.3) plt.barh(y,x,height 0.3) #散点图用来xy轴之间的联系 趋势 plt.scatter(x,y) #导入p…

Python大数据分析——K近邻模型(KNN)

Python大数据分析——K近邻模型 数学部分模型思想模型步骤距离度量指标欧氏距离曼哈顿距离余弦相似度 K值选择 代码部分函数示例1——知识掌握程度示例2——预测发电量 数学部分 模型思想 如图所示&#xff0c;模型的本质就是寻找k个最近样本&#xff0c;然后基于最近样本做“…

Qwen-7B推理教程【Python调用+web端部署】

前提 操作系统为Ubuntu22.04.4 LTS安装Anaconda&#xff08;本人安装教程如下&#xff09; Ubuntu22.04.4 LTS系统/安装Anaconda【GPU版】-CSDN博客 安装python3.9/pytorch/torchvision&#xff08;本人安装教程如下&#xff09; Ubuntu22.04.4系统/安装python3.9/pytorch/…

51单片机嵌入式开发:9、 STC89C52RC 操作LCD1602技巧

STC89C52RC 操作LCD1602技巧 1 代码工程2 LCD1602使用2.1 LCD1602字库2.2 巧妙使用sprintf2.3 光标显示2.4 写固定长度的字符2.5 所以引入固定长度写入方式&#xff1a; 3 LCD1602操作总结 1 代码工程 承接上文&#xff0c;在原有工程基础上&#xff0c;新建关于lcd1602的c和h…

前端项目本地的node_modules直接上传到服务器上无法直接使用(node-sasa模块报错)

跑 jekins任务的服务器不能连接外网下载依赖包&#xff0c;就将本地下载的 node_modules直接上传到服务器上&#xff0c;但是运行时node-sass模块报错了ERROR in Missing binding /root/component/node_modules/node-sass/vendor/linux-x64-48/binding.node >> 报错信息类…

深度学习设计模式之代理模式

文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 代理模式是结构型设计模式&#xff0c;主要是为其他对象提供一种代理以控制对这个对象的访问。 一、介绍 代理模式&#xff08;Proxy Pattern&#xff09;是一种常用…

快速在springboot项目中应用EasyExcel

一、介绍 EasyExcel 是阿里巴巴开源的简化Excel文件读取和写入的开源库。主要的特点如下&#xff1a; 简单易用的API&#xff1a;EasyExcel提供简单API&#xff0c;隐藏处理Excel文件的底层细节。注解支持&#xff1a;支持使用注解将Java对象映射到Excel列&#xff0c;便于Ja…

《梦醒蝶飞:释放Excel函数与公式的力量》11.3 ISTEXT函数

第11章&#xff1a;信息函数 第三节 11.3 ISTEXT函数 11.3.1 简介 ISTEXT函数是Excel中的一个信息函数&#xff0c;用于检查指定单元格中的内容是否为文本。如果单元格内容是文本&#xff0c;则返回TRUE&#xff1b;否则返回FALSE。ISTEXT函数在数据验证、条件格式化和逻辑判…

【UE5.1】Chaos物理系统基础——06 子弹破坏石块

前言 在前面我们已经完成了场系统的制作&#xff08;【UE5.1】Chaos物理系统基础——02 场系统的应用_ue5&#xff09;以及子弹的制作&#xff08;【UE5.1 角色练习】16-枪械射击——瞄准&#xff09;&#xff0c;现在我们准备实现的效果是&#xff0c;角色发射子弹来破坏石柱。…

如何利用扩散实现结构功能动态调控?

如何利用扩散实现结构功能动态调控&#xff1f; 利用扩散机制在生物打印结构内部创建特定空间梯度的方法&#xff0c;主要分为两个方面&#xff1a; 1. 形成形态发生素梯度 形态发生素的作用&#xff1a;形态发生素是能够诱导细胞响应的信号分子&#xff0c;常用于生物打印结…

探索GitHub上的两个革命性开源项目

在数字世界中&#xff0c;总有一些项目能够以其创新性和实用性脱颖而出&#xff0c;吸引全球开发者的目光。今天&#xff0c;我们将深入探索GitHub上的两个令人惊叹的开源项目&#xff1a;Comic Translate和GPTPDF&#xff0c;它们不仅改变了我们处理信息的方式&#xff0c;还极…

Debezium日常分享系列之:Debezium 3.0.0.Alpha1 Released

Debezium日常分享系列之&#xff1a;Debezium 3.0.0.Alpha1 Released 一、重大改变Java 和 Maven 要求已更改 二、新的特征和提高MongoDB 三、更多内容 Debezium 3 的第一个预发布版本 3.0.0.Alpha1。这个版本虽然比正常的预版本要小&#xff0c;但高度关注几个关键点&#xff…

docker中mysql设置lower_case_table_names配置的坑

前沿 今天在使用flowable流程框架的时候&#xff0c;遇到一个问题。需要配置MySQL数据库以实现表名大小写不敏感。本以为这是一个简单的任务&#xff0c;却耗费了我两个多小时的时间。 docker容器中修改配置&#xff0c;重启不成功 我们前提是容器中的mysql中已经有很多数据…

Web安全:SQL注入

一、SQL注入三要素 1、用户可以对输入的参数值进行修改。 2、后端不对用户输入的参数值进行严格过滤。 3、用户修改后的参数值可以被带入后端中成功执行&#xff0c;并返回一定结果。 二、SQL注入原理 简单来说&#xff0c;用户输入的值会被插入到SQL语句中&#xff0c;然后…

Milvus 核心设计(1) ---- 数据一致性的等级及使用场景

目录 背景 Milvus的数据一致性 设置数据一致性等级 等级类型 PACELC定理 level 详细解释 Strong Bounded staleness Session Eventually 总结 背景 分布式上的可扩展性是个比较重要的concept。Chroma 核心之前写过了,他的最大优势在于轻量级且好用。Milvus相对Ch…

tkinter-TinUI-xml实战(11)多功能TinUIxml编辑器

引言 在TinUIXml简易编辑器中&#xff0c;我们通过TinUI搭建了一个简易的针对TinUIXml布局的编辑器&#xff0c;基本掌握了TinUIXml布局和TinUIXml的导入与导出。现在&#xff0c;就在此基础上&#xff0c;对编辑器进行升级。 本次升级的功能&#xff1a; 更合理的xml编辑与…

大众汽车入职SHL在线测评、英语口语、招聘笔试如何通过、考点分析|备考建议

大众汽车入职在线测验真题考点分析&#xff0c;通过技巧&#xff1f; 大众汽车集团&#xff08;中国&#xff09;在招聘过程中&#xff0c;认知能力测试是评估候选人是否适合某个职位的重要环节。候选人会收到带有线上测评链接的邮件&#xff0c;测评包括胜任力潜力测试(Compe…

多输入多输出 | Matlab实现Transformer多输入多输出预测

多输入多输出 | Matlab实现Transformer多输入多输出预测 目录 多输入多输出 | Matlab实现Transformer多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现Transformer多输入多输出预测&#xff08;完整源码和数据&#xff09; 1.da…