学会ECharts 数据缩放组件

news2024/11/23 22:03:10

本文首发自「慕课网」(imooc.com),想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"或慕课网公众号!
作者:范文杰_fe|慕课网讲师


在一个数据图表中,可能由于数据所表示的时间范围较大,从而导致整个图表相当的长,当这些数据都不得不展示的时候,对我们分析某一段时间内数据的变化造成的极大的影响,所以当我们遇到这种情况的时候就需要用到 ECharts 的数据缩放组件了。


1. 简介

官方解释:
dataZoom 组件 用于区域缩放,从而能自由关注细节的数据信息,或者概览数据整体,或者去除离群点的影响。

慕课解释

dataZoom 组件提供了一套在图表运行状态下,终端用户可以通过鼠标、手指(触屏下)的动作触发图表视图窗口变化,使图表聚焦在某个局部区域的交互功能。dataZoom 有 3 个变种:

inside:内置于图表的缩放组件,用户可以在图表上直接操作缩放动作;
slider:独立与图表外的缩放组件,是三个变种中唯一具有视觉组件的类型,用户主要在滑块上实现交互;
select:框选模式,需要在 toolbox中配置使用。

2. 实例解析

原理上,dataZoom 通过控制坐标轴的数值范围实现图表视图窗口的变化,所以对于开发者来说,无论使用变种,最基本的需要确定 dataZoom 控制的是那个(或那些)数轴,以及对其他数轴的影响。

> **Tips**:  
> dataZoom 只适用于直角坐标系、极坐标系,对于地图、日历坐标系等可考虑使用 [visualmap组件。

 2.1 选定主轴

使用 dataZoom 的第一步是确定缩放组件要控制那一条坐标轴,方法很简单,在直角坐标系下通过设定xAxisIndex或 yAxisIndex为对应坐标轴下标;极坐标系下通过设定 radiusAxisIndex 或 angleAxisIndex为对应坐标轴下标即可。例如下例设定两个 dataZoom 实例并分别指向两个不同类型的坐标轴:

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width,initial-scale=1.0" />
        <title>Echarts Example</title>
    </head>
    <body>
        <div id="main" style="width: 1020px; height: 400px;"></div>

        <script src="//cdn.bootcss.com/echarts/4.5.0/echarts.js"></script>
        <script type="text/javascript">
            const random = (min, max) => Math.round(Math.random() * (max - min) + min);
            const myChart = echarts.init(document.getElementById('main'));

            const option = {
                toolbox: {
                    feature: {
                        saveAsImage: {},
                    },
                },
                dataZoom: [
                    // 作用在直角坐标系上
                    { type: 'slider', xAxisIndex: 0, right: '55%', left: 0 },
                    // 作用在极坐标系上
                    { type: 'slider', angleAxisIndex: 0, left: '55%', right: '5%' },
                ],
                grid: { left: 0, containLabel: true, width: '45%' },
                xAxis: { type: 'value' },
                yAxis: { type: 'category' },
                polar: { left: '50%', containLabel: true, radius: '55%', center: ['77%', '50%'] },
                angleAxis: { type: 'category' },
                radiusAxis: { type: 'value' },
                series: [
                    {
                        data: genSeriesData(7),
                        type: 'bar',
                    },
                    {
                        data: genSeriesData(7),
                        type: 'bar',
                        coordinateSystem: 'polar',
                    },
                ],
            };
            myChart.setOption(option);

            function genSeriesData(len) {
                const result = [];
                for (let i = 0; i < len; i += 1) {
                    const node = [random(10, 100), `S${i + 1}`];
                    result.push(node);
                }
                return result;
            }
        </script>
    </body>
</html>

示例效果:

Tips:
dataZoom 三个变种功能相似,其中只有 slider 类型提供了视觉组件,为演示的便利,本文中的示例默认使用 slider 类型,inside、select 功能类似,以此类推即可。

dataZoom 也支持同时控制两条轴的数据窗口,只需同时指定 xAxisIndex 和 yAxisIndex(极坐标下则同时指定 angleAxisIndex、radiusAxisIndex),不过需要两个轴有相同的类型和数值范围,例如下例:

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width,initial-scale=1.0" />
        <title>Echarts Example</title>
    </head>
    <body>
        <div id="main" style="width: 1020px; height: 400px;"></div>

        <script src="//cdn.bootcss.com/echarts/4.5.0/echarts.js"></script>
        <script type="text/javascript">
            const random = (min, max) => Math.round(Math.random() * (max - min) + min);
            const myChart = echarts.init(document.getElementById('main'));

            const option = {
                toolbox: {
                    feature: {
                        saveAsImage: {},
                    },
                },
                dataZoom: [
                    // 作用在直角坐标系上
                    { type: 'slider', xAxisIndex: 0, right: '55%', left: 0 },
                    // 作用在极坐标系上
                    { type: 'slider', angleAxisIndex: 0, left: '55%', right: '5%' },
                ],
                grid: { left: 0, containLabel: true, width: '45%' },
                xAxis: { type: 'value' },
                yAxis: { type: 'category' },
                polar: { left: '50%', containLabel: true, radius: '55%', center: ['77%', '50%'] },
                angleAxis: { type: 'category' },
                radiusAxis: { type: 'value' },
                series: [
                    {
                        data: genSeriesData(7),
                        type: 'bar',
                    },
                    {
                        data: genSeriesData(7),
                        type: 'bar',
                        coordinateSystem: 'polar',
                    },
                ],
            };
            myChart.setOption(option);

            function genSeriesData(len) {
                const result = [];
                for (let i = 0; i < len; i += 1) {
                    const node = [random(10, 100), `S${i + 1}`];
                    result.push(node);
                }
                return result;
            }
        </script>
    </body>
</html>

缩放后,要求数值项的 x、y 值同时在窗口内才会显示,可以仔细观察下图,随着 dataZoom 滑块的变化,图表 x、y 轴的数值范围同时发生变化:
2.2 选择过滤模式

选定主轴后,可以通过 [filterMode](https://echarts.apache.org/zh/option.html#dataZoom-slider.filterMode) 属性设定 dataZoom 对其它轴及图表数值点的副作用。filterMode 属性支持如下值:

  • filter:对于序列中的数据项,只要有一个维度在数据窗口外,整个数据项就会被过滤掉;
  • weakFilter:对于序列中的数据项,当所有维度都在数据窗口外时,才会被过滤掉;
  • empty:数据窗口之外的数据会被设置为空;
  • none:不过滤数据。

 2.3 优化导出功能

在使用 dataZoom 的场景中,导出图片时会保持经过 dataZoom 调整过的视图窗口,导致图片无法完整地展示整个图表的内容,例如:

<!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width,initial-scale=1.0" />
        <title>Echarts Example</title>
    </head>
    <body>
        <div id="main" style="width: 1020px; height: 400px;"></div>
        <button id="export">export png</button>

        <script src="//cdn.bootcss.com/echarts/4.5.0/echarts.js"></script>
        <script type="text/javascript">
            const random = (min, max) => Math.round(Math.random() * (max - min) + min);
            const myChart = echarts.init(document.getElementById('main'));

            const option = {
                toolbox: { feature: { saveAsImage: {} } },
                dataZoom: [{ type: 'slider', xAxisIndex: 0, start: 14, end: 50 }],
                grid: {},
                xAxis: { type: 'category' },
                yAxis: { type: 'value' },
                series: [
                    {
                        data: genSeriesData(20),
                        type: 'bar',
                    },
                ],
            };
            myChart.setOption(option);

            function genSeriesData(len) {
                const result = [];
                for (let i = 0; i < len; i += 1) {
                    const node = [`S${i + 1}`, random(10, 100)];
                    result.push(node);
                }
                return result;
            }
        </script>
    </body>
</html>

点击右上角工具栏的 saveAsImage 按钮后,导出的结果:


    此时,可以综合使用 ECharts 提供的各类接口,自行实现导出过程。基本流程是:

 

  1. 通过 dataZoom 行为 将数值范围设置为 0% ~ 100%,以展示完整的视图;
  2. 监听 finished 事件,在图表重新渲染完成后,执行导出函数 getDataUrl;
  3. 通过 document.createElement('a') 并设置 src 属性为上一步得到图片 base64 值,模拟点击下载行为,得到完整图片;
  4. 移除 finished 事件监听,避免重复导出;
  5. 重置 dataZoom,恢复操作前的值。

完整示例:   

 <!DOCTYPE html>
<html lang="zh-CN">
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width,initial-scale=1.0" />
        <title>Echarts Example</title>
    </head>
    <body>
        <div id="main" style="width: 1020px; height: 400px;"></div>
        <button id="export">export png</button>

        <script src="//cdn.bootcss.com/echarts/4.5.0/echarts.js"></script>
        <script type="text/javascript">
            const random = (min, max) => Math.round(Math.random() * (max - min) + min);
            const myChart = echarts.init(document.getElementById('main'));

            const option = {
                toolbox: { feature: { saveAsImage: {} } },
                dataZoom: [{ type: 'slider', xAxisIndex: 0, start: 14, end: 50 }],
                grid: {},
                xAxis: { type: 'category' },
                yAxis: { type: 'value' },
                series: [
                    {
                        data: genSeriesData(20),
                        type: 'bar',
                    },
                ],
            };
            myChart.setOption(option);

            // 此处实现自定义的图片导出过程
            document.getElementById('export').addEventListener('click', () => {
                const dz = myChart.getModel().option.dataZoom[0];
                // 记录当前时刻的偏移值
                const oldStart = dz.start;
                const oldEnd = dz.end;

                // 通过 action 将dataZoom组件数值范围设置为 0%-100%
                myChart.dispatchAction({ type: 'dataZoom', start: 0, end: 100 });
                // 监听渲染完成事件
                myChart.on('finished', download);

                function download() {
                    const img = myChart.getDataURL({
                        backgroundColor: '#fff',
                        // 导出时排除 dataZoom 组件
                        excludeComponents: ['toolbox', 'dataZoom'],
                        pixelRatio: 1,
                    });
                    const anchor = document.createElement('a');
                    anchor.href = img;
                    anchor.setAttribute('download', 'test.jpeg');
                    anchor.click();
                    // 移除事件监听,避免多次导出
                    myChart.off('finished', download);

                    myChart.dispatchAction({ type: 'dataZoom', start: oldStart, end: oldEnd });
                }
            });

            function genSeriesData(len) {
                const result = [];
                for (let i = 0; i < len; i += 1) {
                    const node = [`S${i + 1}`, random(10, 100)];
                    result.push(node);
                }
                return result;
            }
        </script>
    </body>
</html>

通过该示例能够正确导出完整图表,结果如:

 3. 小结

 本文结合多个实例,讲述 Echarts 数据缩放组件(dataZoom)的使用方法,包括选定缩放主轴的策略;各类过滤模式的表现;以及在缩放组件介入的场景下,如何完整导出图表。



欢迎关注「慕课网」官方帐号,我们会一直坚持提供IT圈优质内容,分享干货知识,大家一起共同成长吧!

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

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

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

相关文章

Mtlab基础(十):极限的求解

在做研究的过程中,需要涉及到极限的求解,面对简单的极限大家都能够轻松解决,但是当面临复杂的问题时,传统的差分进化算法就难以解决了。 对于求解极限,Matlab提供了非常好的工具**limit**,具体的使用方法: limit(f,v,a)-------------------------------------------…

RFID在空调装配中的作用

RFID在空调装配中的作用 随着物联网和射频识别技术 (RFID) 的发展&#xff0c;越来越多的应用开始使用 RFID 技术来提高生产效率和产品质量。在空调装配过程中&#xff0c;RFID 技术可以发挥重要作用。 RFID 技术可以帮助空调制造商提高装配效率。使用 RFID 技术&#xff0c;…

CircuitBreaker Resilience4J 介绍

最近接触到了CircuitBreaker Resilience4J &#xff0c;网上查了查资料&#xff0c;这里整合记录一下&#xff0c;供大家学习和参考 目录 前言 1、熔断器出现背景 ​​​​​​​ 2、支持断路器实现有以下几种 3、Circuit Breaker原理 4、概念说明 限流 — RateLimiter …

CPU Architecture

CPU Architecture [/ˈɑːrkɪtektʃər/] 指令集架构 &#xff08;Instruction Set Architecture&#xff09;精简指令集处理器 RISC (Reduce Instruction Set Computer)复杂指令集处理器 CISC (Complex Instruction Set Computer) CPU按指令集架构分类ARM运行模式非特权模式…

什么是NTFS for Mac?2023新版本如何下载

在NTFS for Mac中包含了多种功能操作&#xff0c;促进软件更好地使用&#xff0c;可以进行全局设置&#xff0c;也可以针对某一各挂载的磁盘进行针对性设置。 本集小编主要向大家介绍它包含的一些基本功能&#xff0c;看看这款mac读写工具能够实现那些功能&#xff0c;全面了解…

安科瑞电能表对于预付费平台的费控策略应用

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要:基于智能电能表的预付费系统平台可以实现对预付费客户的适时算费、远程费控和服务。预付费系统的费控策略包括算费子策略、催费预警提醒子策略、欠费停电子策略&#xff0c;介绍3个子策略的制定原则、设计流程&…

Flink学习——状态编程

目录 一、Flink中的状态 二、状态编程 (一)ValueState案例——判断传感器的数据 1.代码实现 2.端口进行传输数据 3.运行结果 (二)ListState (三)MapState案例——比较学生每次考试成绩 1.代码实现 2.端口传输学生成绩 3.运行结果 (四)ReducingState 一、Flink中的状…

0Ω的电阻作用

0欧姆电阻即电阻标值为0欧姆的电阻&#xff0c;多用于PCB设计等方面&#xff0c;是一种理想电阻。那0欧姆电阻是表示没有电阻吗&#xff1f;当然不是&#xff0c;0欧姆电阻的阻值不是0欧姆&#xff0c;只是接近0欧姆。 1、调试方便或者兼容设计&#xff1a;可以选择器件、功能…

网络安全--XXE漏洞利用思路

一、XXE 是什么 介绍 XXE 之前&#xff0c;我先来说一下普通的 XML 注入&#xff0c;这个的利用面比较狭窄&#xff0c;如果有的话应该也是逻辑漏洞 如图所示&#xff1a; 既然能插入 XML 代码&#xff0c;那我们肯定不能善罢甘休&#xff0c;我们需要更多&#xff0c;于是出…

Python环境安装,操作MySQL数据脚本

安装Python 下载地址Python Releases for macOS | Python.org下载安装包点击安装执行python3命令查看安装及版本 安装插件 安装PyMySQL python3 -m pip install PyMySQL 编写脚本 创建文件selectMysql.py #!/usr/bin/python import pymysql.cursors def updateuser(user_…

chatgpt赋能Python-python3_4

Python3-4: 编程领域的瑰宝 简介 Python3-4 是一种开源解释型高级编程语言&#xff0c;具有简单易学、可读性强、语法简洁的特点。它由谷歌公司所开发&#xff0c;在全球范围内被广泛应用于Web开发、人工智能、科学计算、数据分析等领域。 优势 1. 语法简洁 Python3-4采用…

今天面试招了个20K的人,从腾讯出来的果然都有两把刷子···

现在找个会自动化测试的人真是难呀&#xff0c;10个里面有8个写了会自动化&#xff0c;但一问就是三不知 公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;前面一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在15-20k&#xff0c;面试的…

实施基于零信任网络安全的设备控制

零信任安全是一种数据保护策略&#xff0c;除非系统管理员进行彻底验证&#xff0c;否则网络边界内外的所有设备和实体都不受信任。Device Control Plus 可帮助管理员为其网络实施和自动化零信任安全协议&#xff0c;以确保对来自未经批准的外围设备的所有端点数据提供最佳保护…

嵌入式软件测试笔记1 | 简单说明 嵌入式系统认识和测试目标

1 | 简单说明 & 嵌入式系统认识和测试目标 1 为什么看这个&#xff1f;2 一些说明3 主要内容是什么&#xff1f;4 嵌入式系统测试的目标4.1 测试的任务4.2 最终目标4.3 测试过程4.4 通用元素 5 嵌入式系统的一些基础 1 为什么看这个&#xff1f; 一直在间断性的学习和了解…

chatgpt赋能Python-python3_6怎么调整字体大小

Python3.6 是一种广泛使用的编程语言&#xff0c;可以帮助人们创建各种各样的应用程序。不过&#xff0c;当我们在使用 Python3.6 编写程序时&#xff0c;有时会遇到一些困难&#xff0c;比如如何调整字体大小。那么&#xff0c;今天我们就来看看如何应对这个问题。 如何在 Py…

(十二)centos7案例实战——swap虚拟内存配置

前言 在实际生产环境中&#xff0c;我们的服务器由于内存配置资源有限&#xff0c;会遇到一些线上服务宕机或者内存溢出等问题&#xff0c;那么如何解决这些问题呢&#xff0c;一方面我们要确认问题的具体原因&#xff0c;通过排查自身应用服务的问题&#xff0c;一方面增加我…

Linux 之 supervisor安装和使用

Supervisor 官网 一、介绍 Supervisor有四个组件&#xff1a; 1. supervisord 运行Supervisor的后台服务&#xff0c;它用来启动和管理那些你需要Supervisor管理的子进程&#xff0c;响应客户端发来的请求&#xff0c;重启意外退出的子进程&#xff0c;将子进程的stdout和s…

Bean的自动装配

目录结构 导入pom.xml依赖包 <dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><vers…

工赋开发者社区 | Gartner发布2023年十大数据和分析趋势

来源&#xff1a;Gartner Gartner&#xff08;技术研究和分析机构&#xff09;近日公布了2023年十大数据和分析&#xff08;D&A&#xff09;趋势&#xff0c;可帮助企业领导者通过预测变化将不确定性转化为新的商机。 正文开始 Gartner在Gartner数据与分析峰会上介绍了企…

诞生两年,这个产品便成为腾讯安全的“秘密武器”

腾讯既是企业服务产品的服务商又是使用者&#xff0c;很多产品最原始的出发点最早只是为了解决腾讯自身某一个需求&#xff0c;经过不断地发展完善和业务场景锤炼&#xff0c;最终从进化成一个成熟的企服产品。本系列文章讲述的是这样一组Made in Tencent故事&#xff0c;这是系…