Echarts x轴坐标二级分组

news2024/11/18 6:36:41

         在使用echarts 封装组件的时候,偶尔会遇到需要x轴坐标进行二层分组的需求。那么如何对echarts 进行二层分组呢,有以下几个步骤:

仅介绍二层分组的逻辑。有兴趣的可以进行三层延伸。

1,修改echarts Options 中xAxis 的配置。

此时若进行e二层分组,则xAxis 应该是一个数组,里面有两个x轴的配置对象。

第一个x轴对象除了需要data属性,其余属性正常配置即可。

第二个x轴对象需要配置

xAxis[
	{
	  // 第一个x轴坐标(最靠近x轴的那个坐标
	  type:'category',
	   data:[],
     },
     {
       // 第二个x轴坐标
         type:'category',
         position: 'bottom', 坐标轴的位置
         offset:40, // 该坐标轴x轴文本向下偏移距离
         axisTick:{
              length: 40, // 增加分组下面父级坐标刻度线长度
              interval:  // 这个属性很重要下面介绍
         },
         axisLabel:{
            align: 'center',
            interval: 0,
            formatter:// 这个属性很重要,下面介绍。
          },
          data:[],
     }
]

现在第二个x轴配置只有axisTick.interval,axisLabel.formatter这两个属性没有介绍。在下面会继续介绍的。

2,处理接口中返回的x轴数据,此时返回的x轴数据应该是一个数组并且分为两种情况。

以下图示例

 2.1,第一种情况也是最终需要的数据结构

需要单层数据即可表达二级父子关系
interface XAxis {
    first: string,  // 第一层数据 (距离坐标轴最近的数据)
    second: string  // 第二层父级数据
}
// 则以上面数据为例,原始x轴数据为
xAxisData = [
  {second:'水果',first:'香蕉'},
  {second:'水果',first:'苹果'},
  {second: '笔', first:'圆珠笔'},
  {second:'笔', first:'钢笔'},
]
// 此种数据结构就是最为合适的。第一层x轴数据大家直接将xAxisData 中的first属性过滤即可
// 第二层数据的处理将会在第三步进行介绍

2.2,第二种接口返回的x轴数据

第二种数据结构为二层数据结构,以上图为例应该是
xAxisData = [
   {second:'水果',child:[
     {first:'香蕉'},
     {first:'苹果'}
    ]},
    {second: '笔', child:[
      {first:'钢笔'},
      {first: '圆珠笔'}
    ]}
],
如果接口返回的是这种二层数据结构,则需要将其扁平化变成上面那种只有一层的数据结构

3,编写辅助函数,配置Option

3.1,辅助函数

/**
     * @description: 计算第N层X轴重复字符串终止索引 n>1
     * @param { string[] } list 第n层x轴全部数据
     * @return {*}
     */
    const countXAxisEndIndex = (list: string[]) => {
      const temp = {} as { [key: string]: number };
      if (list.length) {
        let newVal = list[0];
        let newIndex = 0;
        temp[list[0]] = 0;
        for (let i = 1; i < list.length; i++) {
          if (newVal !== list[i]) {
            temp[newVal] = newIndex;
            newVal = list[i];
          }
          newIndex++;
        }
      }
      temp[list[list.length - 1]] = list.length - 1;
      return temp;
    };
    
     /**
     * @description: 计算第N层X轴重复字符串起始索引 n>1
     * @param { string[] } list 第n层x轴全部数据
     * @return {*}
     */
    const countXAxisStartIndex = (list: string[]) => {
      const temp = {} as { [key: string]: number };
      if (list.length) {
        let newVal = list[0];
        temp[list[0]] = 0;
        for (let i = 1; i < list.length; i++) {
          if (newVal !== list[i]) {
            newVal = list[i];
            temp[list[i]] = i;
          }
        }
      }
      return temp;
    };

3.2,在循环中配置Option

首先已知知最终x轴的数据为
xAxisData = [
  {second:'水果',first:'香蕉'},
  {second:'水果',first:'苹果'},
  {second: '笔', first:'圆珠笔'},
  {second:'笔', first:'钢笔'},
]
在循环中配置xAxis中的数据。
当然目前只有两层可以不进行循环遍历。
只需要给option.xAxis[1]中的配置属性进行赋值即可
1,首先对data 属性进行赋值
option.xAxis[1].data = xAxisData.map((item:any)=>{return item.second;})
2,配置option.xAxis[1].axisTick和option.xAxis[1].axisLabel这两个对象
首先大家可能不知道上面两个辅助数组的作用
countXAxisStartIndex,获取第N层重复字符串的起始索引
const tempStartObj = countXAxisStartIndex(xAxisData)的结果为 {水果:0,笔:2 }
countXAxisEndIndex,获取第N层重复字符串的终止索引
const tempEndObj = countXAxisEndIndex(xAxisData); 的结果为 {水果:1,笔:3}
下面就可以开始配置x轴第二层相关属性了
option.xAxis[1] = {
  ...option.xAxis[1],
  aXisTick:{
      length: 40,
      // 设置第二层刻度线的间隔,当第一个元素,以及每个重复二级元素的最后一个才会设置刻度
      interval: (index: number, value: string) => index === tempEndObj[value] || index === 0,
   },
   axisLabel:{
      align:'center',
      interval:0,
      // 去掉重复的二级坐标刻度,只保留位于一级坐标中间索引的那个二级坐标
      formatter: (value: string, index: number) => {
                const nowIndex = tempEndObj[value] - tempStartObj[value];
                if (index === tempEndObj[value] - Math.ceil(nowIndex / 2)) {
                   return value;
                 }
                 return '';
                },
   }
  };
  注意事项:一定要先进行data属性赋值,否则,下面的aXisTick.interval,aXisLabel.formatter 对应的方法就不会有回调参数了。
  
 

如何进行三层分组,以及多层分组;

大致逻辑和二层分组的逻辑是相同的。

要在循环中生成option.xAxis数组中的每个配置对象。对除了第一级的x坐标轴都需要进行设置position :‘bottom';调整offset 的数值(第N层数据距离x轴的距离。以及增加axisTick.length 刻度的长度,

以上就是echarts 中x轴坐标分组的核心逻辑。

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

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

相关文章

OpenHarmony 实战开发PhotoView——支持图片缩放、平移、旋转的一个优雅的三方组件

简介 PhotoView是OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;系统的一款图片缩放及浏览的三方组件&#xff0c;用于声明式应用开发&#xff0c;支持图片缩放、平移、旋转等功能。 使用场景 PhotoView为广大OpenHarmony应用开发者在处理图片时&#xf…

prompt提示词:如何让AI帮你提一个好问题

我们看完一篇文章的时候&#xff0c;有时候发给AI后&#xff0c;不知道如何问AI&#xff0c;不知道问哪些问题&#xff0c;你使用这个提示词&#xff0c;就可以让AI帮你想一个好问题&#xff0c;然后你用AI想好的问题再去问AI 能提出一个好的问题是非常难的 提示词 结合文章…

出现 Transaction rolled back because it has been marked as rollback-only 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 用户反馈的Bug如下所示: Transaction rolled back because it has been marked as rollback-only截图如下: 浏览器终端同样显示: 2. 原理分析 错误表明,在事务的生命周期内,遇到了某个异常或条件,导致该事务被标记…

elemnt ui 时间选择器。 当前日期往前推6个月以前的的不可选择

<div class"hengxiang"><div class"lefttitle titlesBt" style"color:#15a66a;"><div>建单起始日期</div><el-date-picker class"elinputs" type"date" placeholder"请输入起始日" v-…

【基础篇-Day7:JAVA面向对象的初级使用】

目录 1、类和对象1.1 类的介绍1.2 类和对象的关系1.3 类的组成 2、对象内存图2.1 单个对象内存图2.2 两个对象内存图2.3 两个引用指向相同内存图 3、成员变量和局部变量3.1 成员变量和局部变量的区别 4、this关键字4.1 this可以解决的问题4.2 this介绍4.3 this内存图4.4 this总…

01 一文理解,Prometheus详细介绍

01 一文理解&#xff0c;Prometheus详细介绍 介绍 大家好&#xff0c;我是秋意零。 Prometheus 是一个开源的系统监控和报警工具包&#xff0c;最初由SoundCloud开发&#xff0c;并在2012年作为开源项目发布。Prometheus 目前由Cloud Native Computing Foundation&#xff08…

git 学习(一)

一、版本控制 &#xff08;一&#xff09;介绍 版本迭代 每一次更新代码 都会出现新的版本如果我们需要之前的版本的文件 我们就得需要版本控制的文件 每一次更新的结果我们都保存下来 多人开发必须要用版本控制器 否则代价会很大 &#xff08;二&#xff09;主流的版本控制…

中科驭数驭云、超低时延网络案例双双入选第七届数字中国建设峰会数字化转型典型应用案例

5月24日-25日&#xff0c;第七届数字中国建设峰会在福州召开。在“数字赋能民营经济专业工作会议”上&#xff0c;中关村云计算产业联盟发布了《2024中小企业数字化转型典型应用案例集》&#xff0c;中科驭数驭云、超低时延网络两大方案入选。 作为国内领先的DPU芯片及解决方案…

初识C语言——第二十六天

函数的递归1 什么是递归呢&#xff1f; 递归的两个必要条件 void print(unsigned int n) {if (n > 9){print(n / 10);}printf("%d ", n % 10); }int main() {unsigned int num 0;scanf("%u", &num);//123//递归-函数自己调用自己print(num);//pr…

Ubuntu20.04安装ffmpeg,并捕获视频流

工控机&#xff1a;幻影峡谷 系统&#xff1a;Ubuntu20.04 摄像头&#xff1a;杰瑞微通环星光USB摄像头记录一下使用ffmpeg拉取视频流的原因&#xff1a;刚开始用的是ubuntu系统自带的 茄子 软件&#xff0c;但是视频流很卡&#xff08;非常卡&#xff0c;基本上不能用&#xf…

nuxt3+Element Plus项目搭建过程记录

背景 本文只记录项目搭建过程中遇到的一些问题和关键点&#xff0c;nuxt框架的说明和API请参照官网学习 官网&#xff1a;https://nuxt.com/docs/getting-started/introduction 1. 初始化项目 指令如下: npx nuxilatest init <project-name>我在安装过程中出现报错&a…

前端项目上线

目录 1项目打包 2本地服务器部署 2.1具体操作步骤 2.2解决刷新 404 问题 2.3请求无法发送问题 3nginx 服务器部署 3.2nginx 配置代理练习 安装nginx nginx部署启动项目 3.3nginx 部署前端项目 4云服务器部署 本地资源上传 配置服务器与nginx 1项目打包 ●我…

lvm概述和配额

lvm概述和配额 文章目录 lvm概述和配额LVM概述1、逻辑卷的作用&#xff1a;2、lvm主要命令和实操磁盘配额创建data目录&#xff0c;进入data目录限制创建文件数 LVM概述 逻辑卷管理liunx系统下对硬盘分区的一种管理机制 lvm机制特别适合管理大储存设备&#xff0c;可以动态的…

回答篇二:测试开发高频面试题目

引用之前文章&#xff1a;测试开发高频面试题目 本篇文章是回答篇&#xff08;持续更新中&#xff09; 1. 在测试开发中使用哪些自动化测试工具和框架&#xff1f;介绍一下你对其中一个工具或框架的经验。 a. 测试中经常是用的自动化测试工具和框架有Selenium、Pytest、Postman…

【Linux】解决误操作libc.so.6导致的问题,补充:升级glibc注意事项

千万不要轻易动/usr/lib64/libc.so.6。 glibc是Linux系统中最底层的api&#xff0c;Linux几乎所有运行库都依赖glibc。/usr/lib64/libc.so.6属于glibc&#xff0c;在centos7中是个软链接。 一旦误删或误操作libc.so.6&#xff0c;或者glibc新版本不兼容等原因&#xff0c;都可…

推荐一个 Java 开源企业级新能源汽车智能共享充电桩管理平台

文末可获取 Orise 平台源码 01 Orise 智能充电桩管理平台 奥升( Orise ) 新能源汽车充电桩管理 Saas 云平台是一个集充电设备管理、用户充电管理、线上小程序内容管理于一体的综合管理平台。Orise充电桩平台支持高并发业务、业务动态伸缩、桩通信负载均衡&#xff0c;通过Docke…

AI答题项目,无门槛答题一小时收益30+

朋友们&#xff0c;今天我想和大家探讨一个令人兴奋的副业机遇。你是否曾感觉到日常工作的枯燥乏味&#xff0c;而又渴望找到一种轻松的赚钱方式来增加你的收入&#xff1f;今天我将和你分享的这个项目正是你所期待的。 项目的核心是利用AI技术来回答网上付费用户的问题&…

哪个品种能够叫板白银现货t+d?

白银TD是在上海黄金交易所挂牌的白银投资品种&#xff0c;它可以说是国内版的现货白银交易&#xff0c;大家也可以把它理解成为白银交易的“快速通道”。通过它&#xff0c;投资者可以更加灵活地买卖白银&#xff0c;实现对内地白银价格的跟踪&#xff0c;并获得一定的杠杆化收…

vos3000外呼系统如何查询授权信息和系统并发

要查询VOS3000外呼系统的授权信息和系统并发情况&#xff0c;您可以按照以下步骤进行&#xff1a; 登录系统管理界面&#xff1a; 使用管理员账号登录VOS3000外呼系统的管理界面。 查找系统信息&#xff1a; 寻找系统信息或授权管理的相关选项或标签。 查询授权信息&#xff…

96.网络游戏逆向分析与漏洞攻防-ui界面的设计-角色管理功能的界面设计

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…