ECharts 多季度连续显示到一个图中。

news2024/11/20 4:57:12

效果图

请添加图片描述

二.相关option

以下option可以复制到 echarts的编辑器 进行查看修改

const site = 'test1';
const site2 = 'test2';

const qtrlyOption = function (data: any, titleText: string): any {
  //获取最大值 。最大最小值的目的是:使左右里边的所有bar使用同一个指标
  let yAxisMax = 0;
  let yAxisMin = 0;


  //根据数据整理并获取最大和最小值
  let dataValue = [] as any;
  (data?.series?.[site]?.[0]?.data || []).forEach((item: any[]) => {
    dataValue.push(...item);
  });
  (data?.series?.[site2]?.[0]?.data || []).forEach((item: any[]) => {
    dataValue.push(...item);
  });
  dataValue = dataValue.map((li: number | null | undefined) => li || 0);
  yAxisMax = Math.max(...dataValue);
  const decimalPlaces =
    (yAxisMax + '').indexOf('.') > 0
      ? (yAxisMax + '').replace(/^.*[.]/g, '').length
      : 0;
  yAxisMax = yAxisMax * 1.1; //根据最大值进行10%的变大(显示出来的柱状不会顶到最上面)
  yAxisMax =
    decimalPlaces == 0
      ? parseInt(yAxisMax + '')
      : +yAxisMax.toFixed(decimalPlaces);  
  yAxisMin = Math.min(...dataValue);  //得出和最大值一致的小数位




  //当前显示四个季度。根据显示季度个数,来计算subtitle,grid,对应的布局
  const qtrlyCount = 4 as number;

  //左侧预留位置尽可能的显示完整左侧坐标数值
  const leftPercent = 8 as number;
  //右侧预留位置尽可能的显示完整右侧坐标数值
  const rightPercent = 3.5 as number;

  //储存左右两侧开始的位置
  const left = new Array(qtrlyCount).fill('') as any[];
  const right = new Array(qtrlyCount).fill('') as any[];

  /**
   * 储存最下方季度[2023Q2,2023Q3,2023Q4,2024Q1]的显示文字位置
   */
  const title = [] as any[];

  /**
   * 布局右qtrlyCount=4 块图形区域组成,因此每个距离画布左右侧的位置需要计算出来
   */
  const grid = [] as any[];

  /**
   * x坐标轴。坐标轴为qtrlyCount*2个,前4个是下方的坐标轴。后4个是为了显示头上的坐标线
   */
  const xAxis = [] as any[];
  
  /**
   * y坐标轴。坐标轴为qtrlyCount*2个,前4个是左侧的坐标轴,为了显示bar。后4个是右侧坐标轴,为了显示line的百分值
   */
  const yAxis = [] as any[];

  /**
   * 组装数据 ,数据需要进行指定xAxisIndex下标, yAxisIndex下标。而xAxisIndex,yAxisIndex的下标又对于指定的gridIndex下标,可以对于到指定的图区域
   */
  const series = [] as any[];

  /**
   * 计算位置
   */
  for (let i = 0; i < qtrlyCount; i++) {
    const _leftPoint =
      ((100 - leftPercent - rightPercent) / qtrlyCount) * i + leftPercent;
    left[i] = _leftPoint;

    const _rightPoint =
      ((100 - leftPercent - rightPercent) / qtrlyCount) * i + rightPercent;
    right[qtrlyCount - 1 - i] = _rightPoint; 
  }


  for (let i = 0; i < qtrlyCount; i++) {
    /**
     * title
     */
    title[i] = {
      left: left[i] + left[1] * 0.4 + '%',
      subtext: data.quarters[i],
      bottom: 0
    };
    /**
     * grid
     */
    grid[i] = {
      left:  left[i] + '%', 
      right: right[i] + '%',
      bottom: 50,
      top: 80,
      gridIndex: i
    };

    xAxis[i] = {
      gridIndex: i,
      type: 'category',
      data: data.xAxis[i]
    };
    xAxis[i + qtrlyCount] = {
      gridIndex: i,
      type: 'category',
      data: data.xAxis[i],
      axisTick: {
        show: false
      },
      axisLine: {
        onZero: false
      },
      axisLabel: { show: false }
    };
    //用来实现双坐标轴,当前bar用最左坐标轴,line用最右侧坐标轴
    yAxis[i] = {
      gridIndex: i,
      type: 'value',
      dataType: 'bar', // 标记一下类型,表示后面数据如果是bar则需要对应到对应的yAxisIndex。实际配置中无此参数。
      axisLabel: { show: i == 0 }, //第一个坐标轴显示数字,后面的不显示
      axisLine: { show: true },
      splitLine: { show: true },
      max: () => yAxisMax,
      min: () => yAxisMin
    };

    //用来实现双坐标轴,当前bar用最左坐标轴,line用最右侧坐标轴
    yAxis[i + qtrlyCount] = {
      gridIndex: i,
      type: 'value',
      dataType: 'line', // 标记一下类型,表示后面数据如果是line则需要对应到对应的yAxisIndex。实际配置中无此参数。
      axisLabel: { show: i == qtrlyCount - 1 }, //最后一个坐标轴显示数字,后面的不显示
      axisLine: { show: true },
      splitLine: { show: false },
      max: () => {
        return 100;
      }
    };

    //为最左侧和最右侧坐标显示单位或类型
    if (i == 0) {
      yAxis[i] = {
        ...yAxis[i],
        name: 'QTY' //添加单位
      };
    }
    if (i == qtrlyCount - 1) {
      yAxis[i + qtrlyCount] = {
        ...yAxis[i + qtrlyCount],
        name: '%'
      };
    }
    series.push({
      name: data.series?.[site][0].name,
      data: data.series?.[site][0].data[i],
      type: 'bar',
      xAxisIndex: i,
      yAxisIndex: i,
      color: 'blue'
    });
    series.push({
      name: data.series?.[site2][0].name,
      data: data.series?.[site2][0].data[i],
      type: 'bar',
      xAxisIndex: i,
      yAxisIndex: i,
      color: 'red'
    });

    series.push({
      name: data.series?.[site][1].name,
      data: data.series?.[site][1].data[i],
      type: 'line',
      xAxisIndex: i,
      yAxisIndex: i + qtrlyCount,
      color: 'green'
    });

    series.push({
      name: data.series?.[site2][1].name,
      data: data.series?.[site2][1].data[i],
      type: 'line',
      xAxisIndex: i,
      yAxisIndex: i + qtrlyCount,
      color: 'orange'
    });
  }

  title.push({ left: 'center', top: 0, text: titleText });

  return {
    toolbox: {
      show: true,
      feature: {
        dataZoom: {
          yAxisIndex: 'none',
          title: {
            zoom: '区域缩放',
            back: '区域缩放还原'
          }
        },
        saveAsImage: {
          title: '保存为图片'
        }
      }
    },
    legend: {
      show: true,
      top: 40,
      data: data.legend
    },
    title,
    tooltip: { trigger: 'axis' },
    xAxis,
    yAxis,
    grid,
    series
  };
};
const data = {
  quarters: ['2023Q2', '2023Q3', '2023Q4', '2024Q1'],
  xAxis: [
    ['2023M04', '2023M05', '2023M06'],
    ['2023M07', '2023M08', '2023M09'],
    ['2023M10', '2023M11', '2023M12'],
    ['2024M01', '2024M02', '2024M03']
  ],
  legend: [
    'CamIn (Test1)',
    'CamIn (Test2)',
    'Final Yield (Test1)',
    'Final Yield (Test2)'
  ],
  series: {
    test1: [
      {
        factory: 'Test1hou',
        name: 'CamIn (Test1)',
        type: 'bar',
        data: [
          [5323451, 32411232, 14323414],
          [15133835, 25333835, 3432342],
          [37233835, 1513835, 17913835],
          [4317244, 3245234, 12334234]
        ]
      },
      {
        factory: 'Test1hou',
        name: 'Final Yield (Test1)',
        type: 'line',
        data: [
          [12, 32,43],
          [32, 34, 64],
          [73, 65, 96.30],
          [96.90,76, 72]
        ]
      }
    ],
    test2: [
      {
        factory: 'Penang',
        name: 'CamIn (Test2)',
        type: 'bar',
        data: [
          [5323321, 3241132, 34334314],
          [12133335, 12543835, 3432342],
          [12234435, 2513835, 4213835],
          [4317244, 1245234, 42334234]
        ]
      },
      {
        factory: 'Penang',
        name: 'Final Yield (Test2)',
        type: 'line',
        data: [
          [52, 52,83],
          [42, 74, 94],
          [83, 75, 69],
          [90,86, 72]
        ]
      }
    ]
  }
} as any;

option = qtrlyOption(data, '这一个季度的测试数据');

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

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

相关文章

Java实现农村物流配送系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

SpringCloud.04.熔断器Hystrix( Spring Cloud Alibaba 熔断(Sentinel))

目录 熔断器概述 使用Sentinel工具 什么是Sentinel 微服务集成Sentinel 配置provider文件&#xff0c;在里面加入有关控制台的配置 实现一个接口的限流 基本概念 重要功能 Sentinel规则 流控规则 简单配置 配置流控模式 配置流控效果 降级规则 SentinelResource…

设计模式-委托模式

设计模式专栏 模式介绍模式特点应用场景委托模式在GUI编程场景的应用代码示例Java实现委托模式Python实现委托模式 委托模式在spring中的应用 模式介绍 委托模式是一种软件设计模式&#xff0c;其中一个对象&#xff08;委托对象&#xff09;将某些操作委托给另一个对象&#…

关于如何禁用、暂停或退出OneDrive等操作,看这篇文件就够了

​想知道如何禁用OneDrive?你可以暂停OneDrive的文件同步,退出应用程序,阻止它在启动时打开,或者永远从你的机器上删除该应用程序。我们将向你展示如何在Windows计算机上完成所有这些操作。 如何在Windows上关闭OneDrive 有多种方法可以防止OneDrive在你的电脑上妨碍你。…

护眼灯有蓝光吗?防蓝光护眼台灯推荐

护眼台灯是家长为孩子购买的常见用品之一&#xff0c;但对于它的了解却不够深入&#xff0c;很多人购买之后反而容易出现眼睛疲劳、不适的情况&#xff01;据了解&#xff0c;主要的原因是因为在选择护眼台灯时&#xff0c;大多数人没有专业知识&#xff0c;没有买到合适的护眼…

Windows10 Docker Desktop安装

一、简介 Docker Desktop是Docker公司推出的一款桌面应用程序&#xff0c;它提供了一个用户友好的界面&#xff0c;方便开发人员在本地环境中使用容器技术。 容器是一种轻量级的虚拟化技术&#xff0c;可以将应用程序和其依赖项打包在一起&#xff0c;形成一个独立、可移植的…

每日一题——LeetCode1200.最小绝对差

方法一 个人方法 排序一次遍历&#xff1a; 最小差值一定是出现在大小相邻的两个元素之间&#xff0c;所以将数组从小到大排序 循环求两元素之间的差值&#xff0c;先假设当前差值为最小差值&#xff0c;先往res数组里面push数据&#xff0c;当碰到更小差值的时候&#xff0c…

acwing BFS

BFS BFS 重点就是要使用 队列 进行每一层的搜索不同题目 队列中保存的元素形式都各不相同&#xff0c;并且也会用到其他辅助结构走迷宫一题&#xff0c;队列中存的是每一层(当前步能走的所有坐标)的坐标&#xff0c;并保存了每一层对应走过的步数八数码一题&#xff0c;队列中…

Android Traceview 定位卡顿问题

Traceview 是一个 Android 性能分析工具&#xff0c;用于时间性能分析&#xff0c;主要帮助开发者了解应用程序中各个方法的执行时间和调用关系。Traceview 可以通过图形化界面查看应用程序的代码执行细节&#xff0c;包括每个方法的调用次数、方法调用的时间消耗、方法调用堆栈…

家政服务小程序搭建,有什么优势?

随着我国社会经济的发展&#xff0c;家政服务成为了每个家庭的一部分。家政服务的种类也逐渐多样&#xff0c;满足了大众日益增加的服务需求。 不过&#xff0c;传统的家政行业以中介为主&#xff0c;雇主在找到适合的家政人员较为麻烦&#xff0c;限制了家政行业的发展&#…

【基于 InternLM 和 LangChain 搭建你的知识库】学习笔记

学习参考文档【基于 InternLM 和 LangChain 搭建你的知识库】 学习参考链接【书生・浦语大模型实战营第三课作业(基础进阶)】 理论 实战 收集原始数据 收集2018年-2020年几年间的优秀数学建模论文 修改脚本文件&#xff0c;测试文件 作业 复现课程知识库助手搭建过程 La…

曲线生成 | 图解贝塞尔曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 贝塞尔曲线的应用2 图解贝塞尔曲线3 贝塞尔曲线的性质4 算法仿真4.1 ROS C仿真4.2 Python仿真4.3 Matlab仿真 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法…

CAN工具 - ValueCAN3 - 基础介绍

关注菲益科公众号—>对话窗口发送 “CANoe ”或“INCA”&#xff0c;即可获得canoe入门到精通电子书和INCA软件安装包&#xff08;不带授权码&#xff09;下载地址。 CAN/CANFD通讯广泛存在于整个车载网络中&#xff0c;几乎每一块软硬件的开发都需要用到CAN工具&#xff0c…

Open CASCADE学习|创建旋转体

旋转体是一个几何概念&#xff0c;指的是通过旋转一个平面图形得到的立体图形。具体来说&#xff0c;一个平面图形绕着它所在的平面内的一条定直线旋转一周所形成的曲面&#xff0c;这个曲面会围成一个几何体&#xff0c;这个几何体就叫做旋转体。这条定直线被称为旋转体的轴。…

划重点!多微信号一键定时发圈,省时省力!

发朋圈对于很多职场人来说是一种社交媒体营销和个人品牌建设的重要手段。 然而&#xff0c;一个人面对几个微信号的朋友圈&#xff0c;难免会有应付不过来的时候&#xff0c;这时候只需要一个个微管理管理系统&#xff0c;就能帮你一键定时发圈&#xff0c;省去重复发布的时间…

从零开始:生产环境如何部署 Bytebase

Bytebase 是面向研发和 DBA 的数据库 DevOps 和 CI/CD 协同平台。目前 Bytebase 在全球类似开源项目中 GitHub Star 数排名第一且增长最快。 Bytebase 的架构 Bytebase 是一个单体架构 (monolith)&#xff0c;前端是 Vue3 TypeScript&#xff0c;后端是 Go。前端利用 Go 1.6 …

说说TCP 3次握⼿和4次握手

三次握手过程 client端建⽴连接&#xff0c;发送⼀个SYN同步包&#xff0c;发送之后状态变成SYN_SENTserver端收到SYN之后&#xff0c;同意建⽴连接&#xff0c;返回⼀个ACK响应&#xff0c;同时也会给client发送⼀个SYN包&#xff0c;发送完成之后状态变为SYN_RCVDclient端收到…

匹配excel表格中两列数据

案例&#xff1a;时间序列D列是打乱的&#xff08;假的时间序列&#xff09;&#xff0c;那么真正的时间序列G&#xff0c;需要将数值一一匹配。那么要输入公式&#xff1a;VLOOKUP(G2,D$2:E$144,2,FALSE) 其中&#xff0c;G2是一个查询的属性&#xff0c;D$2:E$144是被查询的表…

鸿蒙开发笔记(三):页面和自定义组件生命周期

先明确自定义组件和页面的关系&#xff1a; 自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。 页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定义组件为页面的入口组件&#xff0c…

Linux网络通信

网络模型 七层模型 四层模型 TCP : 面向连接&#xff0c;可靠的&#xff0c;面向字节流&#xff0c;支持点对点通信。 UDP : 无连接&#xff0c;不可靠&#xff0c;面向数据报文&#xff0c;支持一对一&#xff0c;一对多&#xff0c;多对多。通信原理 常用函数 #include <…