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

news2024/9/20 1:06:42

问题描述
使用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.coloradmin.cn/o/1922479.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【经验总结】将markdown文档转换为word(swagger导出word)

工具准备&#xff1a; 任意markdown编辑器&#xff0c;以typora为例pandoc&#xff0c;官方下载地址 思路整理&#xff1a; 从swagger提取离线md文档将md文档转换为word格式 操作步骤&#xff1a; 一、安装pandoc &#xff08;markdown编辑器安装略&#xff09; 前往官网…

【学术会议征稿】第三届能源互联网及电力系统国际学术会议(ICEIPS 2024)

第三届能源互联网及电力系统国际学术会议&#xff08;ICEIPS 2024&#xff09; 2024 3rd International Conference on Energy Internet and Power Systems 能源互联网是实现新一代电力系统智能互动、开放共享的重要支撑技术之一&#xff0c;也是提升能源调度效率&#xff0…

大模型最新黑书:基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理 PDF

今天给大家推荐一本丹尼斯罗斯曼(Denis Rothman)编写的关于大语言模型&#xff08;LLM&#xff09;权威教程<<大模型应用解决方案> 基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理>&#xff01;Google工程总监Antonio Gulli作序&#xff0c;这含金量不…

常见的网络安全设备

一、防火墙 防火墙的核心任务&#xff1a;防护和控制&#xff0c;防火墙通过安全策略识别流量并做出相应的动作。 防火墙的安全策略在进行匹配时&#xff0c;自上而下逐一匹配&#xff0c;匹配成功则不向下进行匹配&#xff0c;末尾隐含拒绝所有规则。 1.包过滤防火墙 工作范围…

ChatGPT Mac App 发布!

2024 年 6 月&#xff0c;OpenAI 的大语言模型 ChatGPT 的 Mac 客户端与 ChatGPT-4o 一起发布了。ChatGPT Mac 户端可以让用户直接在 Mac 电脑上使用 ChatGPT 进行对话。它提供了一个简单易用的用户界面&#xff0c;用户可以在其中输入文本或语音指令&#xff0c;并接收模型生成…

(视频演示)基于OpenCV的实时视频跟踪火焰识别软件V1.0源码及exe下载

本文介绍了基于OpenCV的实时视频跟踪火焰识别软件&#xff0c;该软件通过先进的图像处理技术实现对实时视频中火焰的检测与跟踪&#xff0c;同时支持导入图片进行火焰识别。主要功能包括相机选择、实时跟踪和图片模式。软件适用于多种场合&#xff0c;用于保障人民生命财产安全…

VMWare 下给Centos扩容

目录 参考文档背景介绍扩容查看当前文件磁盘信息增加一个存储分区创建物理卷把物理卷添加到卷组查看卷组名把物理卷并入卷组 对文件系统进行扩容搞定 参考文档 1、百度经验 2、CSDN 3、掘金 背景介绍 测试环境用VMWare 安装centos7&#xff0c;几年下来磁盘空间不够用了&…

【全面介绍Photoshop,什么是Photoshop?】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 目录 🏆前言🏆界面熟悉🏆基础工具🏆图层🏆调整与修饰🏆颜…

【postgresql】权限(Privileges)

权限&#xff08;privileges&#xff09;是决定用户或角色可以对数据库对象&#xff08;如表、视图、序列和函数&#xff09;执行哪些操作的许可。权限对于维护安全性和控制对数据的访问至关重要。 权限分类 在 PostgreSQL 中&#xff0c;权限分为以下几种&#xff1a; SELEC…

ESP32CAM物联网教学12

ESP32CAM物联网教学12 MicroPython 视频服务 小智希望能在MicroPython中实现摄像头的视频服务&#xff0c;就像官方示例程序CameraWebServer那样。 下载视频服务驱动库 小智通过上网搜索&#xff0c;发现相关的教学材料还不少&#xff0c;并且知道有人已经写出了视频服务的驱…

【微信小程序知识点】手机号验证组件

手机验证组件&#xff0c;用于帮助开发者向用户发起手机号申请&#xff0c;必须经过用户同意后&#xff0c;才能获得由平台验证后的手机号&#xff0c;进而为用户提供相应的服务。 手机号验证组件分为两种&#xff1a;手机号快速验证组件以及手机号实时验证组件。 1.手机号快速…

StarRocks部署高可用 FE 集群

一、准备工作 1.1 部署规划 这里我打算部署存算一体模式&#xff0c;三节点。即三个FE节点&#xff0c;三个BE节点。假设三台IP分别为&#xff1a;10.10.10.50、10.10.10.51、10.10.10.52 我将采用三台centos7.9进行部署&#xff0c;单台配置为128C 256G 3T。 1.2 服务器检查…

web前端开发——标签一(注释、标题、段落、换行、格式、图片)

今天我来针对web前端开发讲解标签一 目录 html标签_标题&段落&换行 注释标签&#xff1a;Ctrl/ 标题标签&#xff1a; h1-h6 段落标签&#xff1a; 换行标签: 格式标签 图片标签_src属性 html标签_标题&段落&换行 注释标签&#xff1a;Ctrl/ Ctrl/ &…

如何利用大模型提高金融合规场景的工作效率?

金融是强监管行业&#xff0c;遵守法律法规、行业标准和内部政策是金融行业的基本要求。在强监管合规环境下&#xff0c;金融机构需要降低合规风险并提升服务质量。 人工审核效率低、成本高&#xff0c;且存在主观性导致的风险。过去&#xff0c;金融机构基于规则和NLP模型构建…

ArcGIS如何快速对齐两个图层

1、问题 如何让两个图层快速对齐 2、使用捕捉工具 移动点或折点&#xff0c;使其与其他要素的折点、边或端点精确重合。 可指定捕捉规则来控制是将输入折点捕捉到指定距离范围内的最近折点、边还是端点。

大模型时代的目标检测

https://zhuanlan.zhihu.com/p/663703934https://zhuanlan.zhihu.com/p/6637039341.open set/open word/ood 这个任务是指在实际应用上可以检测任何前景物体&#xff0c;但是有些不需要预测类别&#xff0c;只要检测出框就行。在很多场合也有应用场景&#xff0c;有点像类无关…

小白股票投资手册:股票入门基础知识合集!

小白股票投资手册&#xff1a;股票入门基础知识合集&#xff01; 随着经济的发展和人们对财富增长的渴望&#xff0c;股票投资已经成为许多人关注的焦点。然而&#xff0c;对于初次接触股票的小白来说&#xff0c;面对繁多的专业术语和复杂的市场变化&#xff0c;往往会感到迷茫…

Uniapp鸿蒙项目实战

Uniapp鸿蒙项目实战 24.7.6 Dcloud发布了uniapp兼容鸿蒙的文档&#xff1a;Uniapp开发鸿蒙应用 在实际使用中发现一些问题&#xff0c;开贴记录一下 设备准备 windows电脑准备&#xff08;家庭版不行&#xff0c;教育版、企业版、专业版也可以&#xff0c;不像uniapp说的只有…

Android --- Kotlin学习之路:自己写一个SDK给别的APP用(暴漏一个接口,提供学生的身高数据)

今天又来肝kotlin了&#xff0c;主题是&#xff1a;用kt写一个SDK给其他人用&#xff0c;这个小技能在项目中会经常用到&#xff0c;应该有很多小伙伴还不会用&#xff0c;不会的请往下看—⬇ 在项目里面新建一个module 选择Android library&#xff0c;然后点击finish就行了 …

使用Apache服务部署静态网站

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、网站服务程序 ​二、配置服务文件参数 ​三、SELinux安全子系统 四、个人用户主页功能 ​五、虚拟网站主机功能 六、Apache的访问控制…