Echarts x轴坐标二级分组

         在使用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轴坐标分组的核心逻辑。

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

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

相关文章

win11中文文件名称乱码解决方案

解压后出现以下的乱码 解决方案 步骤1.winR 输入intl.cpl 或 windows 自带的搜索搜“intl.cpl”&#xff0c;打开这个面板控制项 步骤2.在新打开的区域面板中&#xff0c;选择“管理”标签页&#xff0c;点击下方的“更改系统区域设置”按钮 步骤3.取消"Beta版…"选…

如何将RK R75键盘的右Alt键改为Ctrl键

打开注册表地址栏中输出 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout右键新建二进制值&#xff0c;名称设为ScanCode Map按下图输入数值

【NumPy】全面解析NumPy的bitwise_and函数:高效按位与操作指南

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

鸿蒙4.2小版本推出,鸿蒙5.0已经不远了

上个月&#xff0c;市场上迎来了华为鸿蒙系统4字开头的小升级&#xff0c;版本来到了4.2版本。 我们先来看看4.2版本都给用户带来哪些特色&#xff1a; 界面切换更流畅&#xff1a;无论是响应速度还是操作手感&#xff0c;用户都将感受到更加迅速和顺滑的体验 搜星速度的显著…

磁盘管理以及文件系统08

1、为什么要对磁盘进行分区&#xff1f; 业务层面&#xff1a;为满足一定的需求所是做的特定操作。 2、硬盘是什么&#xff0c;以及硬盘的作用 硬盘&#xff1a;计算机的存储设备&#xff0c;一个或者多个带磁性的盘组成的&#xff0c;可以在盘片上进行数据的读写。硬盘的最…

深入解析Python中的两种导入方法:from...import与import

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、from...import与import的基本区别 1. 导入方式的不同 2. 命名空间的差异 三…

开源与闭源:AI大模型发展路径的博弈

一、引言 在人工智能&#xff08;AI&#xff09;领域&#xff0c;大模型以其卓越的性能和广泛的应用前景&#xff0c;成为了近年来技术发展的热点。然而&#xff0c;在大模型的发展路径上&#xff0c;开源与闭源两种模式一直存在着激烈的博弈。本文将深入探讨这两种模式在大模…

ZooKeeper安装

安装Zookeeper 1、下载Zookeeper安装包 打开链接选择一个版本进行下载 https://zookeeper.apache.org/releases.html2、上传Zookeeper安装包到集群 输入命令 scp apache-zookeeper-3.8.4-bin.tar.gz hadoop192.168.88.100:/tmp也可以使用xftp等上传&#xff0c;物理机用u盘…

DINO结构中的exponential moving average (ema)和stop-gradient (sg)

DINO思路介绍 在 DINO 中&#xff0c;教师和学生网络分别预测一个一维的嵌入。为了训练学生模型&#xff0c;我们需要选取一个损失函数&#xff0c;不断地让学生的输出向教师的输出靠近。softmax 结合交叉熵损失函数是一种常用的做法&#xff0c;来让学生模型的输出与教师模型的…

C++学习笔记(19)——模板

目录 模板参数与非类型模板参数 模板参数 类型模板参数——传递类型 非类型模板参数——传递数量 C11希望array替代静态数组&#xff0c;但实际上vector包揽了一切 模板总结 优点&#xff1a; 缺点&#xff1a; 模板特化&#xff1a;针对某些类型进行特殊化处理 特化…

代码随想录算法训练营第五十三天||1143.最长公共子序列、1035.不相交的线、53. 最大子序和

文章目录 一、1143.最长公共子序列 思路 二、1035.不相交的线 思路 三.53. 最大子序和 思路 一、1143.最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原…

mysql中text,longtext,mediumtext区别

文章目录 一.概览二、字节限制不同三、I/O 不同四、行迁移不同 一.概览 在 MySQL 中&#xff0c;text、mediumtext 和 longtext 都是用来存储大量文本数据的数据类型。 TEXT&#xff1a;TEXT 数据类型可以用来存储最大长度为 65,535(2^16-1)个字符的文本数据。如果存储的数据…

stream-实践应用-统计分析

背景 业务部门提供了一个数据&#xff0c;数据甚至不是excel类型的&#xff0c;是data.txt&#xff0c;每一行都是一个数据&#xff0c;需要对此数据进行统计分析 统计各个月份的销量 因为直接获取resources下的data.txt&#xff0c;所以要借助输入流进行获取数据&#xff0c;再…

初识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…

Scrapy框架简单介绍及Scrapy项目编写详细步骤(Scrapy框架爬取豆瓣网站示例)

引言 Scrapy是一个用Python编写的开源、功能强大的网络爬虫框架&#xff0c;专为网页抓取和数据提取设计。它允许开发者高效地从网站上抓取所需的数据&#xff0c;并通过一系列可扩展和可配置的组件来处理这些数据。Scrapy框架的核心组成部分包括&#xff1a; Scrapy Engine&…

matplotlib ---词云图

词云图是一种直观的方式来展示文本数据&#xff0c;可以体现出一个文本中词频的使用情况&#xff0c;有利于文本分析&#xff0c;通过词频可以抓住一篇文章的重点 本文通过处理一篇关于分析影响洋流流向的文章&#xff0c;分析影响洋流流向的主要因素都有哪些 文本在文末结尾 …

用手机做客服的吐槽点客服亲们有同感吗

聊天宝手机版很好的解决了&#xff0c;客服手机快速回复客户的需求&#xff0c;不论微信&#xff0c;企业微信&#xff0c;千牛或其他手机APP回复客户&#xff0c;都可以用聊天宝APP实现图文一键发送&#xff0c;非常方便 前言 做客服工作&#xff0c;除了电脑上回复客户咨询&…

一文读懂Maven的安装与配置

一、前言【可忽略】 Maven本质是一个项目管理工具&#xff0c;类似于JDK是java开发工具。 我们需要管理什么呢&#xff1f;首先各种各样的依赖&#xff0c;比如SpringFramwork、Mybatis。 简单点做&#xff0c;我们新建个目录&#xff0c;就能管理这些jar包。然而&#xff0c;缺…

第 8 章 机器人平台设计之传感器(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 8.6.1 传感器_激光雷达简介 激光雷达是现今机器人尤其是无人车领域及最重要、最关键也是最常见的传感器之一&…

转型先锋!G7易流的数字化到底有多牛?

在供应链全球一体化进程中&#xff0c;国内外局势的改变&#xff0c;使得物流行业运力供大于求趋势愈加明显&#xff0c;国内供应链参与者面对内外发展需求和激烈的市场竞争&#xff0c;需要打破同质化竞争的局面&#xff0c;提供具有特色的服务&#xff0c;形成专业、高效、灵…