首页 > 其他分享 >ECharts实现两条曲线数据比较,数据高出区域高亮显示

ECharts实现两条曲线数据比较,数据高出区域高亮显示

时间:2023-08-10 18:12:25浏览次数:45  
标签:highLine resultObj 高亮 type let diffArea const 数据 ECharts

显示效果:

 代码实现:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ECharts实现两条曲线数据比较,高出区域高亮显示</title>
    <link rel="stylesheet" href="./index.css" />
    <!-- 引入 ECharts.js 库 -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js"></script>
    <!-- <script src="./echarts.min.js"></script> -->
  </head>
  <body>
    <!-- 用于显示图表的 DOM 元素 -->
    <div id="chart" style="width: 800px; height: 400px"></div>

    <script>
      /**
       * echarts diff值形成多变形
       * @param { type: array, desc: 数据高出的第一条线 } highLine
       * @param { type: array, desc: 数据低于的第二条线 } lowLine
       */
      const echartsPolygon = (highLine, lowLine) => {
        // 求出:第一条线高于第二条线的数据 {x:x轴坐标,high:高坐标,low:底点坐标}
        const xAxle = highLine.map((_, idx) => idx);
        const diffArea = [];
        for (let i = 0, len = xAxle.length; i < len; i++) {
          if (highLine[i] > lowLine[i]) {
            let prevNode = null;
            if (i === 0) {
              prevNode = null;
            } else {
              prevNode = {
                x: i - 1,
                high: highLine[i - 1],
                low: lowLine[i - 1],
              };
            }

            let nextNode = null;
            if (lowLine[i + 1] > highLine[i + 1]) {
              nextNode = null;
            } else {
              nextNode = {
                x: i + 1,
                high: highLine[i + 1],
                low: lowLine[i + 1],
              };
            }

            diffArea.push(
              prevNode,
              {
                x: i,
                high: highLine[i],
                low: lowLine[i],
              },
              nextNode
            );
          } else {
            diffArea.push(null);
          }
        }

        // 多边形分组,如果其中high等于low则为开始或结束位置,则需要分组
        let areasLen = -1;
        let areasList = [];
        for (let i = 0, len = diffArea.length; i < len; i++) {
          if (diffArea[i] === null) {
            areasLen += 1;
            areasList.push([]);
          } else {
            // 强化处理,避免低位数据比高位数据还添加到数组里
            if (diffArea[i].low > diffArea[i].high) {
              continue;
            }
            areasList[areasLen].push(diffArea[i]);
          }
        }
        // 过滤空数组
        areasList = areasList.filter((arr) => arr.length);

        // 点连线,线连面
        // 先获取高点的点,再获取低点的点,形成二维数组矩形
        let resultObj = {};
        for (let i = 0, iLen = areasList.length; i < iLen; i++) {
          resultObj[i] = [];
          const point = areasList[i];
          // 获取高点数据,顺序
          for (let j = 0, jLen = point.length; j < jLen; j++) {
            resultObj[i].push([point[j].x, point[j].high]);
          }
          // 获取低点数据,倒序
          for (let z = point.length - 1; z >= 0; z--) {
            resultObj[i].push([point[z].x, point[z].low]);
          }
        }

        return resultObj;
      };

      //------------------------------------------------------------ 业务代码 -------------------------------------------------------------------

      // 初始化 ECharts 实例
      var myChart = echarts.init(document.getElementById("chart"));

      // 蓝线比红线高时绘制区域阴影,其它不用
      const time_slot = [0, 1, 2, 3, 4, 5, 6, 7];
      const red_line = [1, 3, 3, 4, 5, 4, 3, 9];
      const blue_line = [0, 4, 3, 5, 5, 4, 6, 8];

      // 矩形数据
      const resultObj = echartsPolygon(blue_line, red_line);
      const customList = [];
      for (const key in resultObj) {
        const item = resultObj[key];
        customList.push({
          type: "custom",
          name: "黄色区域",
          data: item,
          renderItem: function (params, api) {
            if (params.context.rendered) {
              return;
            }
            params.context.rendered = true;

            let points = [];
            for (let i = 0; i < item.length; i++) {
              points.push(api.coord(item[i]));
            }
            return {
              type: "polygon",
              transition: ["shape"],
              tooltip: {
                formatter: {},
              },
              shape: {
                points: points,
              },
              style: api.style({
                fill: "yellow",
              }),
            };
          },
        });
      }

      const option = {
        animation: false,
        tooltip: {
          confine: true,
          trigger: "axis",
          formatter: (params) => {
            let time = "";
            time = time_slot[params[0].dataIndex];

            const h = params.reduce((prev, cur) => {
              if (cur.componentSubType === "custom") {
                return prev;
              }
              return `${prev}<div>${cur.marker}${cur.seriesName}:${cur.value}</div>`;
            }, "");
            return `<div>${time}</div>${h}`;
          },
        },
        yAxis: {
          type: "value",
        },
        xAxis: {
          type: "category",
          boundaryGap: false,
          data: time_slot,
        },
        legend: {
          data: [
            {
              name: "蓝线",
            },
            {
              name: "红线",
            },
            // {
            //   name: "黄色区域",
            // },
          ],
        },
        series: [
          {
            data: blue_line,
            type: "line",
            color: "blue",
            name: "蓝线",
          },
          {
            data: red_line,
            type: "line",
            color: "red",
            name: "红线",
          },
          ...customList,
        ],
      };

      // 使用配置项显示图表
      myChart.setOption(option);
    </script>
  </body>
</html>

 

标签:highLine,resultObj,高亮,type,let,diffArea,const,数据,ECharts
From: https://www.cnblogs.com/zion0707/p/17621161.html

相关文章

  • 记录一个奇葩的huggingface数据加载问题
    使用dataset=datasets.load_dataset("beyond/rlhf-reward-single-round-trans_chinese")下载数据集会报错:FileNotFoundError:[Errno2]Nosuchfileordirectory:'C:/Users/Chenxm/.cache/huggingface/datasets/beyond___rlhf-reward-single-round-trans_chinese......
  • 数据库--etcd数据不一致
    1.查看集群情况,发现db大小不一样,且差距很大[root@localhostkube_etcd]#/home/s/bin/etcdctl--endpoints=https://11.0.1.149:2379,https://11.0.1.150:2379,https://11.0.1.151:2379--cacert=/home/s/cert/kube_etcd/ca.pem--cert=/home/s/cert/kube_etcd/client.pem--......
  • 如何使用HTTP代理IP抓取数据
    在进行数据抓取时如何使用HTTP代理IP的呢?主要有以下四种方法:1、获取可用的HTTP代理IP:可以通过购买私密HTTP代理IP或使用公开的HTTP代理IP网站来获取可用的HTTP代理IP。确保获取的代理IP列表是有效且稳定的。2、设置HTTP代理IP:在爬虫程序中,使用合适的库(如requests、urllib等)发送请求......
  • 私有化部署数据算力云平台
    近日,据某咨询机构发布的一份调查报告,中国国内有近50%的云客户,主要是大中型企业,他们出于安全和隐私方面的考虑,避免与云服务厂商深度绑定,不会购买云服务厂商提供的数据云服务,而是更倾向租用云服务厂商的裸机资源,然后在上面部署自己自主可控的数据计算系统和应用。如果这项报道属实的......
  • Java 数据类型和变量的完整指南
    目录一、字面常量1.1什么常量?1.2常见的六种常量类型二、数据类型2.1什么是数据类型?2.2基本数据类型:2.3引用数据类型三、变量3.1什么是变量?3.2变量的命名规则3.3变量的作用域3.4变量的被final修饰四.类型转换4.1什么是类型转换?4.2自动类型转换4.3强制类型转换4.4注意事项4.5类型提升......
  • 错误使用LEFT JOIN 导致错误数据释疑
      昨天,公司的某位熟悉业务和SQL的人员,着急忙慌的找我,说必须要解决一个线上的SQL的问题,发现数据对不上了,搞不定挨批事小,但数据错误事关重大。责无旁贷的赶紧和他一起分析这个SQL。 其实就是两个表,一个表中有另一个表的关联键,你可以认为是主外键关系(这里仅仅是关系,我没有说是......
  • 数据库-etcd备份恢复
    1.member下数据说明:snap:存放快照数据,etcd防止WAL文件过多而设置的快照,存储etcd数据状态wal:存放预写式日志,最大的作用是记录了整个数据变化的全部历程。在etcd中,所有数据的修改在提交前,都要先写入到WAL中 2.备份,只需要备份其中一台etcdexportETCDCTL_API=3/home/s/bin/etc......
  • 一种基于Nginx的热点数据调度处理方法
    本文分享自天翼云开发者社区《一种基于Nginx的热点数据调度处理方法》,作者:康****彬一、应用场景  基于Nginx的热点数据调度处理,热点节点数据负载均衡处理,减少热点节点压力,提高处理和访问效率;每一个节点的nginx服务接收大量的访问,但是每个节点处理请求都有一个峰值,当请求数......
  • 【专题】2023全民学习力洞察与数字营销指南报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33404原文出处:拓端数据部落公众号学习能力是将知识资源转化为知识资本的能力。它包括对所学内容的兴趣和热情,有助于更深入理解和掌握知识,提高个人的认知和思维能力。阅读原文,获取专题报告合集全文,解锁文末158份学习教育行业相关报告。教育和娱乐......
  • 拓端tecdat|R语言实现k-means聚类优化的分层抽样(Stratified Sampling)分析各市镇的人
    原文链接:http://tecdat.cn/?p=23038原文出处:拓端数据部落公众号最近我们被客户要求撰写关于k-means聚类的研究报告,包括一些图形和统计输出。简介假设我们需要设计一个抽样调查,有一个完整的框架,包含目标人群的信息(识别信息和辅助信息)。如果我们的样本设计是分层的,我们需要选择......