echarts实现折线图点击添加标记

news2024/11/25 12:43:57

文章目录

    • 背景
    • 一、代码示例


背景

业务场景体现在功能层面主要两点,

  1. 折线图表设置点击事件
  2. 点击事件与图标渲染标记绑定

对于节点没有被添加标记的可以,弹框提示添加标记,并提供标记内容输入框,已经添加过标记的点,点击直接显示标记内容


一、代码示例

dom

  <div class="chartbox-dom"
               ref="voltageLineRef"></div>

标记弹窗

  <!-- 标记弹窗 -->
  <el-dialog v-model="dialogVisible"
             :title="dialogTitle"
             width="300">
    <div v-if="dialogTitle == '添加标记'">
      <p style="padding-bottom: 10px;font-size: 14px;color:#E6E6E6;">标记内容:</p>
      <el-input v-model="tagContent"
                :rows="2"
                type="textarea"
                placeholder="请输入标记内容" />
    </div>
    <div style="font-size: 14px;color:#E6E6E6;"
         v-else>
      {{ tagContent }}
    </div>
    <template #footer>
      <div>
        <el-button @click="handleClose">关闭</el-button>
        <el-button type="primary"
                   v-if="dialogTitle == '添加标记'"
                   @click="confirm">
          保存
        </el-button>
      </div>
    </template>
  </el-dialog>

逻辑:

import * as echarts from 'echarts'

const tagContent = ref('') //弹窗内容
const markPointData = reactive({
  y0: [
    {
      coord: [2, 0],
      name: '标记内容自定义1',
    },
    {
      coord: [5, 1],
      name: '标记内容自定义2',
    },
  ], // 标记内容
  y1: [],
})
const dialogVisible = ref(false) //控制弹窗
const coordValue = ref([]) //坐标
const dialogTitle = ref('添加标记')
const seriesIndex = ref(0) //折线图索引


//曲线
function voltageLineDraw() {
  let voltageLineChart = echarts.init(voltageLineRef.value)
  voltageLineChart.group = 'echartGroup'
  let option = {
    tooltip: {
      trigger: 'axis',
      backgroundColor: 'rgba(16,28,55,0.9)',
      textStyle: {
        color: '#fff',
      },
      axisPointer: {
        type: 'cross',
      },
      formatter: function (params) {
        var result = params[0].name + '<br/>'
        params.forEach(function (item) {
          var value = item.data
          var status
          if (value == 0) {
            status = '低'
          } else if (value == 1) {
            status = '中'
          } else {
            status = '高'
          }
          var color = item.color // 获取折线的颜色
          result += `
                        <div style="display: flex; align-items: center;">
                            <span style="display: inline-block; width: 10px; height: 10px; background-color:${color}; border-radius: 50%; margin-right: 5px;"></span>
                            ${item.seriesName}: ${status}
                        </div>
                        `
        })
        return result
      },
    },
    legend: {
      top: 0,
      right: 10,
      itemWidth: 12, // 图例标记的图形宽度
      itemHeight: 14, // 图例标记的图形高度
      textStyle: {
        color: '#747C90',
      },
      data: ['运行状态', '告警状态'],
    },
    grid: {
      top: 30,
      left: 20,
      right: 40,
      bottom: 10,
      containLabel: true,
    },
    xAxis: {
      type: 'category',
      boundaryGap: false,
      axisLabel: {
        color: '#8A92A6',
      },
      data: [
        '2023-02-21',
        '2023-02-22',
        '2023-02-23',
        '2023-02-24',
        '2023-02-25',
        '2023-02-26',
        '2023-02-27',
      ],
    },
    yAxis: {
      type: 'value',
      axisLabel: {
        color: '#8A92A6',
      },
      splitLine: {
        // 网格线
        show: true,
        lineStyle: {
          //分割线
          color: '#2E3552',
          width: 1,
          type: 'dashed', //dotted:虚线 solid:实线
        },
      },
    },
    dataZoom: [
      {
        show: false,
        realtime: true,
        xAxisIndex: 'all',
      },
      {
        type: 'inside',
        realtime: true,
        show: false,
        xAxisIndex: 'all',
      },
    ],
    series: [
      {
        name: '运行状态',
        type: 'line',
        symbol: 'circle',
        data: [0, 1, 0, 2, 0, 1, 2],
        markPoint: {
          data: markPointData.y0,
          symbolSize: 30,
          itemStyle: {
            color: 'red',
          },
          label: {
            fontSize: 10,
            color: '#fff',
          },
        },
      },
      {
        name: '告警状态',
        type: 'line',
        symbol: 'circle',
        data: [2, 1, -1, 0, 1, 0, 1],
        markPoint: {
          data: markPointData.y1,
          symbolSize: 30,
          itemStyle: {
            color: 'red',
          },
          label: {
            fontSize: 10,
            color: '#fff',
          },
        },
      },
    ],
  }
  voltageLineChart.setOption(option)
  voltageLineChart.off('click') //处理点击重复问题
  voltageLineChart.on('click', (params) => {
    switch (params.componentType) {
      case 'markPoint':
        tagContent.value = params.data.name
        openDialog('标记内容', params.dataIndex, params.value)
        break
      case 'series':
        tagContent.value = ''
        openDialog('添加标记', params.dataIndex, params.value)
        break
    }
    seriesIndex.value = params.seriesIndex
    dialogVisible.value = true
  })
  echarts.connect('echartGroup')
  window.addEventListener('resize', () => {
    voltageLineChart.resize()
  })
}

/* 打开弹窗 */
function openDialog(title, index, value) {
  dialogTitle.value = title
  coordValue.value = [index, value]
  dialogVisible.value = true
}
/* 弹窗关闭 */
function handleClose() {
  tagContent.value = ''
  dialogVisible.value = false
}
/* 弹窗确定 */
function confirm() {
  const hasCoordIndex = markPointData['y' + seriesIndex.value].findIndex(
    (num) => num.coord[0] == coordValue.value[0]
  )
  if (hasCoordIndex == -1) {
    markPointData['y' + seriesIndex.value].push({
      coord: coordValue.value,
      name: tagContent.value,
    })
  } else {
    markPointData['y' + seriesIndex.value].splice(hasCoordIndex, 1, {
      coord: coordValue.value,
      name: tagContent.value,
    })
  }
  voltageLineDraw()
  dialogVisible.value = false
}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

python pynput实现鼠标点击两坐标生成截图

脚本主要实现以下功能&#xff1a; 按ctrl开始截图&#xff0c;点击两个坐标&#xff0c;保存截图tk输出截图文本信息&#xff0c;文本输出内容倒序处理默认命名为A0自增。支持自定义名称&#xff0c;自增编号&#xff0c;修改自定义名称自增重新计算清空文本框内容 from pyn…

笨蛋学算法之LeetCodeHot100_5_三数之和(Java)

package com.lsy.leetcodehot100;import java.util.ArrayList; import java.util.Arrays; import java.util.List;public class _Hot6_三数之和 {public static List<List<Integer>> threeSum(int[] nums) {//先排序数组Arrays.sort(nums);//存放结果集List<Lis…

超强开源全能日程助手—揭秘FullCalendar

引言 FullCalendar 是一个广受欢迎的开源 JavaScript 库&#xff0c;用于在网页上展示和管理事件和日程。 它最初是基于 jQuery 开发的&#xff0c;但随着时间的推移&#xff0c;经过 v1~v6 版本的迭代后&#xff0c;它已经全面支持React、Vue 和 Angular 的版本。FullCalend…

【ARMv8/v9 GIC 系列 2.2 -- GIC SPI 中断的 GICD_ISACTIVER 和 GICD_ICACTIVER 配置】

文章目录 GIC 中断 Active 状态的配置中断状态分类GICD_ISACTIVER<n>GICD_ICACTIVER<n>参数 n 编号解释中断设置举例设置中断ID 68为活动状态清除中断ID 68的活动状态 小结 GIC 中断 Active 状态的配置 在ARMv8/ARMv9 体系结构中&#xff0c;GICD_ISACTIVER<n&…

2024年全国青少信息素养大赛python编程复赛集训第四天编程题分享

整理资料不容易,感谢各位大佬给个点赞和分享吧,谢谢 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容: 【小学组】 1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准函数; 2.掌握注释的方法; 3.掌握基本数…

【一步一步了解Java系列】:认识异常类

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff1a;小闭…

qt开发-09_分裂器

QSplitter 是 Qt 框架中的一个非常实用的控件&#xff0c;用于创建可调整大小的窗格。它允许用户通过拖动子窗口间的边界&#xff08;也称为分割条&#xff09;来动态调整子窗口的尺寸。这在开发需要多个视图同时显示&#xff0c;且用户需要根据需要调整每个视图大小的应用程序…

pdf只要其中一页,pdf只要其中几页怎么弄

在现代办公和学习环境中&#xff0c;pdf文件因其跨平台、保持原样等优点而被广泛使用。然而&#xff0c;有时我们需要一个pdf其中页或其中几页&#xff0c;以便更好地管理和使用其中的内容。本文将详细介绍几种拆分pdf文件的方法&#xff0c;帮助您轻松应对各种拆分需求。 打开…

【LeetCode:2663. 字典序最小的美丽字符串 + 贪心】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Qt creator day3练习

2、升级优化自己应用程序的登录界面。 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面显示。 widget…

架构师指南:现代 Datalake 参考架构

这篇文章的缩写版本于 2024 年 3 月 26 日出现在 The New Stack 上。 旨在最大化其数据资产的企业正在采用可扩展、灵活和统一的数据存储和分析方法。这一趋势是由企业架构师推动的&#xff0c;他们的任务是制定符合不断变化的业务需求的基础设施。现代数据湖体系结构通过将数…

Android记录9--实现转盘效果

自定义View /2013.10.16_TurnPlate_Demo/src/com/wwj/turnplate/TurnPlateView.java package com.wwj.turnplate; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; im…

LabVIEW机器视觉在质量控制中的应用

基于LabVIEW的机器视觉系统在质量控制中应用广泛&#xff0c;通过图像采集、处理和分析&#xff0c;自动检测产品缺陷、测量尺寸和识别标记&#xff0c;提高生产效率和产品质量。下面介绍LabVIEW机器视觉系统在质量控制中的实现方法、应用场景及其优势。 项目背景 在现代制造业…

攻防世界-pdf

方法一&#xff1a;打开是pdf格式的文件&#xff0c;里面有一张图&#xff0c;题目提示图下面什么都没有&#xff1f;emmm用chrom打开pdf——ctrlf搜索flag&#xff0c;里面是有东西的&#xff0c;ctrla复制就可以了。 方法二&#xff1a;题目提示图下面什么都没有&#xff0c;…

刷代码随想录有感(112):动态规划——组合总和IV

题干&#xff1a; 代码&#xff1a; class Solution { public:int combinationSum4(vector<int>& nums, int target) {vector<int>dp(target 1, 0);dp[0] 1;for(int j 0; j < target; j){for(int i 0; i < nums.size(); i){if(j > nums[i] &…

idea中的git在clone文件提示 filename too long

一 解决版本 1.1 问题描述以及解决办法 当在Windows系统下使用Git时出现“filename too long”错误&#xff1a; git config --system core.longpaths true

Minillama3->dpo训练

GitHub - leeguandong/MiniLLaMA3: llama3的迷你版本,包括了数据,tokenizer,pt的全流程llama3的迷你版本,包括了数据,tokenizer,pt的全流程. Contribute to leeguandong/MiniLLaMA3 development by creating an account on GitHub.https://github.com/leeguandong/MiniLL…

Starlink全系卫星详细介绍,波段频谱、激光星间链路技术、数据传输速率等等

Starlink全系卫星详细介绍&#xff0c;波段频谱、激光星间链路技术、数据传输速率等等。 Starlink是SpaceX公司开发的一个低轨道&#xff08;LEO&#xff09;卫星网络系统&#xff0c;旨在为全球用户提供高速宽带互联网服务。截至2024年6月&#xff0c;Starlink已经发射并运行…

1950 Springboot汽修技能点评系统idea开发mysql数据库APP应用java编程计算机网页源码maven项目

一、源码特点 springboot 汽修技能点评系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统 具有完整的源代码和数据库&…

2024头歌数据库期末综合(部分题)

目录 第1关&#xff1a;数据表结构修改1 任务描述 学习补充 答案 第2关&#xff1a;数据记录删除 任务描述 学习补充 答案 第3关&#xff1a;数据表结构修改2 任务描述 学习补充 答案 第5关&#xff1a;数据查询一 任务描述 学习补充 答案 本篇博客声明&…