Vue中使用ECharts图表中的阈值标记(附源码)

在数据处理和可视化领域,我们经常需要对一系列数据点进行分析。本文将介绍如何在给定的数据点中找到对应于特定Y值的X值,并设置标线起始点标记在ECharts图表中,效果图如下:

实现步骤

1、数据准备

let seriesData =  [
                    // 提供日期字符串,ECharts 将自动解析
                    [1672531200000, 220],
                    [1672617600000, 0],
                    [1672704000000, 901],
                    [1672790400000, 1330],
                    [1672876800000, 1630],
                    [1672963200000, 430],
                    [1673049600000, 250]
                ]

2、计算阈值Y值

假设Y值为最大值的90%:

let maxDataValue = seriesData.reduce((max, item) => Math.max(max, item[1]), 0);
let thresholdValue = maxDataValue * 0.9;

3、查找对应的X值

function findXByY(dataPoints, givenY) {
    // 遍历数据点数组
    for (let i = 0; i < dataPoints.length - 1; i++) {
        // 获取当前点和下一个点的坐标
        const [x1, y1] = dataPoints[i];
        const [x2, y2] = dataPoints[i + 1];

        // 判断给定Y值是否在当前点和下一个点之间
        if (y1 <= givenY && givenY <= y2) {
            // 计算并返回对应的X值
            return x1 + (givenY - y1) * (x2 - x1) / (y2 - y1);
        }
    }

    // 如果给定Y值不在任何两个点之间,返回undefined
    return undefined;
}



const xValue = findXByY(seriesData, thresholdValue);

4、在ECharts图表中标记

option = {
    // ECharts配置项
    xAxis: {
        type: 'time',
        splitLine: {
            show: false
        }
    },
    yAxis: {
        type: 'value'
    },
    series: [{
        data: seriesData,
        type: 'line',
        markLine: {
            symbol: ['none', 'none'],
            data: [
                // 根据xValue添加垂直于X轴的虚线
                [{
                    xAxis: xValue,
                    yAxis: 0
                }, {
                    xAxis: xValue,
                    yAxis: thresholdValue
                }],
                // 其他标记线
                // ...
            ]
        }
    }]
}

完整代码:

<template>
  <div>
    <div id="myEcharts" class="charts"></div>
  </div>
</template>

<script>
import * as echarts from "echarts";
export default {
  data() {
    return {};
  },
  mounted() {
    this.seriesData = [
      [0, 1733286720001],
      [30, 1733286721001],
      [40, 1733286722001],
      [60, 1733286723001],
      [100, 1733286724001],
      [100, 1733286725001],
      [200, 1733286726001],
      [200, 1733286727001],
      [300, 1733286728001],
      [0, 1733286729001],
    ];
    this.seriesData = this.seriesData.map((pair) => [pair[1], pair[0]]);
    let firstYZero = this.seriesData.find((pair) => pair[1] === 0);

    let maxDataValue = this.seriesData.reduce(
      (max, item) => Math.max(max, item[1]),
      0
    );
    let thresholdValue = maxDataValue * 0.9;

    const xValue = this.findXByY(this.seriesData, thresholdValue);
    let option = {
      xAxis: {
        type: "time", // 使用时间轴
        name:'日期',
        splitLine: {
          show: false,
        },
        axisLabel: {
          interval: 0, 
        },
      },
      yAxis: {
        type: "value",
      },
      series: [
        {
          data: this.seriesData,
          type: "line",
        //   smooth: true,
          markLine: {
            symbol: ["none", "none"], // 线两端无箭头
            data: [
              // 垂直于X轴的虚线
              [
                {
                  xAxis: xValue, // 使用日期字符串
                  yAxis: 0,
                  lineStyle: {
                    color: "#000",
                  }
                },
                {
                  xAxis: xValue,
                  yAxis: thresholdValue,
                },
              ],
              [
                {
                  xAxis: firstYZero[0], // 使用日期字符串
                  yAxis: 0,
                  lineStyle: {
                    color: "#000",
                  }
                },
                {
                  xAxis: firstYZero[0],
                  yAxis: thresholdValue,
                },
              ],
              // 垂直于Y轴的虚线
              [
                {
                  xAxis: xValue, // 使用日期字符串
                  yAxis: thresholdValue,
                  label: {
                    formatter: "响应时间",
                    position: "middle", // 标签位置
                  },
                  lineStyle: {
                    color: "#000",
                  }
                },
                {
                  xAxis: firstYZero[0],
                  yAxis: thresholdValue,
                },
              ],
              [
                {
                  type: "max",
                  lineStyle: {
                    color: "red",
                  },
                },
                {
                  xAxis: "min",
                  yAxis: "max",
                },
              ],
              {
                yAxis: 250,
                label: {
                  formatter: "标准线",
                  position: "end",
                },
                lineStyle: {
                  color: "#00B79D",
                },
              },
            ],
          },
        },
      ],
    };
    let chartDom = document.getElementById("myEcharts");
    let myChart = echarts.init(chartDom);
    myChart.setOption(option);
  },
  methods: {
    findXByY(dataPoints, givenY) {
      for (let i = 0; i < dataPoints.length - 1; i++) {
        const [x1, y1] = dataPoints[i];
        const [x2, y2] = dataPoints[i + 1];

        // 检查给定的 y 值是否在当前点和下一个点之间
        if (y1 <= givenY && givenY <= y2) {
          // 计算并返回对应的 x 值
          return x1 + ((givenY - y1) * (x2 - x1)) / (y2 - y1);
        }
      }

      // 如果给定的 y 值不在任何两个点之间,则返回 undefined 或抛出错误
      return undefined;
    },
  },
};
</script>

<style scoped>
.charts {
  width: 100%;
  height: 600px;
}
</style>

 

 

 

 

 

 

 

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

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

相关文章

Windows 11 如何配置node.js

一&#xff0c;官网下载 官网首页 下载最新LTS版本&#xff0c;比较稳定&#xff0c;如果想探索更新的版本去探索新的nodejs功能。 1. 下载完成后&#xff0c;双击运行程序&#xff0c;点击next 2. 勾选接受协议&#xff0c;点击next 3. 选择自己的安装路径&#xff08;默认是…

笔记本电脑usb接口没反应怎么办?原因及解决方法

笔记本电脑的USB接口是我们日常使用中非常频繁的一个功能&#xff0c;无论是数据传输、充电还是外接设备&#xff0c;都离不开它。然而&#xff0c;当USB接口突然没有反应时&#xff0c;这无疑会给我们的工作和学习带来不小的困扰。下面&#xff0c;我们就来探讨一下笔记本USB接…

计算机毕业设计hadoop+spark民宿推荐系统 民宿数据分析可视化大屏 民宿爬虫 民宿大数据 知识图谱 机器学习 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

视频监控集中管理方案设计:Liveweb视频汇聚方案技术特点与应用

随着科技的发展&#xff0c;视频监控平台在各个领域的应用越来越广泛。然而&#xff0c;当前的视频监控平台仍存在一些问题&#xff0c;如视频质量不高、监控范围有限、智能化程度不够等。这些问题不仅影响了监控效果&#xff0c;也制约了视频监控平台的发展。 为了解决这些问…

SpringBoot中@Import和@ImportResource和@PropertySource

1. Import Import注解是引入java类&#xff1a; 导入Configuration注解的配置类&#xff08;4.2版本之前只可以导入配置类&#xff0c;4.2版本之后也可以导入普通类&#xff09;导入ImportSelector的实现类导入ImportBeanDefinitionRegistrar的实现类 SpringBootApplication…

css栅格系统与多列

栅格系统 栅格系统是媒体查询的具体实现 栅格系统将页面自动分为12个格子&#xff0c;可以根据不同的类前缀实现不同的页面布局 多列

Unity 利用Button 组件辅助Scroll View 滚动

实现 创建枚举类ScrollDir 以区分滚动方向。每组两个按钮负责同方向上左右/上下滚动。 Update 中实时获取Scroll View 滚动条当前位置。 if (dir.Equals(ScrollDir.vertical)) {posCurrent scroll.verticalNormalizedPosition; } else if (dir.Equals(ScrollDir.horizontal)…

WEB安全 PHP学习

PHP基础 PHP编码显示问题 header ("Content-type: text/html; charsetgb2312"); header("Content-Type: text/html;charsetutf-8"); windows需要使用gbk编码显示 源码是 <?php header ("Content-type: text/html; charsetgb2312"); sys…

4. IO Stream

文章目录 一、相对论理解IO流二、汉语文学理解流三、图解IO流四、俩亲爹InputStream和OutputStream五、FileInputStream字节流读取文件六、FileOutputStream字节流写入文件七、buff缓冲复制文件1. 例一(无buff)2. 例二(有buff) 八、buffered字节缓冲流和装饰设计模式九、FileRe…

图数据库 | 12、图数据库架构设计——高性能计算架构

在传统类型的数据库架构设计中&#xff0c;通常不会单独介绍计算架构&#xff0c;一切都围绕存储引擎展开&#xff0c;毕竟存储架构是基础&#xff0c;尤其是在传统的基于磁盘存储的数据库架构设计中。 类似地&#xff0c;在图数据库架构设计中&#xff0c;项目就围绕存储的方…

YOLOv9改进,YOLOv9引入SAConv可切换空洞卷积,二次创新RepNCSPELAN4结构

摘要 作者提出的技术结合了递归特征金字塔和可切换空洞卷积,通过强化多尺度特征学习和自适应的空洞卷积,显著提升了目标检测的效果。 理论介绍 空洞卷积(Atrous Convolution)是一种可以在卷积操作中插入“空洞”来扩大感受野的技术,更有效地捕捉到图像中的大范围上下文…

【热门主题】000075 探索嵌入式硬件设计的奥秘

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

CanFestival移植到STM32 F4芯片(基于HAL库)

本文讲述如何通过简单操作就可以把CanFestival库移植到STM32 F4芯片上&#xff0c;作为Slave设备。使用启明欣欣的工控板来做实验。 一 硬件连接 观察CAN报文需要专门的设备&#xff0c;本人从某宝上买了一个兼容PCAN的开源小板子&#xff0c;二十几块钱&#xff0c;通过USB接…

洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)

题目链接&#xff1a;P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 首先介绍下二叉树的遍历&#xff1a; 学过数据结构都知道二叉树有三种遍历&#xff1a; 1.前序遍历&#xff1a;根左右 2.中序遍历&#xff1a;左根…

工业—使用Flink处理Kafka中的数据_ProduceRecord2

使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据,统计在已经检验的产品中,各设备每 5 分钟 生产产品总数,将结果存入HBase 中的 gyflinkresult:Produce5minAgg 表, rowkey“

JavaEE-经典多线程样例

文章目录 单例模式设计模式初步引入为何存在单例模式饿汉式单例模式饿汉式缺陷以及是否线程安全懒汉式单例模式基础懒汉式缺陷以及是否线程安全懒汉式单例模式的改进完整代码(变量volatile) 阻塞队列生产者消费者模型生产者消费者模型的案例以及优点请求与响应案例解耦合削峰填…

Web3的技术栈详解:解读区块链、智能合约与分布式存储

随着数字时代的不断发展&#xff0c;Web3作为下一代互联网的核心理念逐渐走进了大众视野。它承载着去中心化、用户主权以及更高效、更安全的网络环境的期望。Web3不再是由少数中心化机构主导的网络&#xff0c;而是通过一系列核心技术的支撑&#xff0c;给每个用户赋予了更多的…

贪心算法实例-问题分析(C++)

贪心算法实例-问题分析 饼干分配问题 有一群孩子和一堆饼干&#xff0c;每个小孩都有一个饥饿度&#xff0c;每个饼干都有一个能量值&#xff0c;当饼干的能量值大于等于小孩的饥饿度时&#xff0c;小孩可以吃饱&#xff0c;求解最多有多少个孩子可以吃饱?(注:每个小孩只能吃…

虚幻引擎---材质篇

一、基础知识 虚幻引擎中的材质&#xff08;Materials&#xff09; 定义了场景中对象的表面属性&#xff0c;包括颜色、金属度、粗糙度、透明度等等&#xff1b;可以在材质编辑器中可视化地创建和编辑材质&#xff1b;虚幻引擎的渲染管线的着色器是用高级着色语言&#xff08;…

Python从入门到入狱

Python是从入门到入狱&#xff1f;这个充满调侃意味的说法在程序员圈子里流传甚广。表面看&#xff0c;它似乎是在嘲笑这门语言从简单易学到深陷麻烦的巨大反差&#xff0c;实际上却隐藏着很多值得深思的问题。要解读这个话题&#xff0c;得从Python的特点、使用场景以及潜在风…