echart 图表添加数据分析功能,(右上控制选择)

echart 图表添加数据分析功能,可区域选择数据,右上按钮,控制echart行为

    chart.on('globalcursortaken', onGlobalcursortaken); //绑定事件
    chart.off("brushSelected");//解绑事件处理函数
    chart.on('brushSelected', renderBrushed);

在这里插入图片描述

   getBarDev2(eIndex, eTimeArr, eSeriesArr, eSensorId, eDeviceId, eDeviceType) {
        //console.log('EEEEEEE', eIndex, eTimeArr, eSeriesArr, eSensorId, eDeviceId, eDeviceType)
        this.$refs.chart.removeAttribute('_echarts_instance_')
        const chart = this.$echarts.init(this.$refs.chart, 'light')
        var option;
        option = {
          title: {
            text: eSensorId + " : " + eDeviceId,
            textStyle: {
              //文字颜色
              color: '#fff',
            }
          },
          textStyle: {
            color: '#fff',//'red',字体颜色
          },
          legend: {
            textStyle: {
              //文字颜色
              color: '#fff',
            }
          },
          tooltip: {
            trigger: 'axis',
            show: true,
            formatter: (params) => {
              var listData = params
              var list = []
              var listItem = ''
              var html = ''
              html += '<span>' + listData[0].name + '<span><br>'
              for (var i = 0; i < listData.length; i++) {
                html += '<i style="display: inline-block;width: 10px;height: 10px;background: ' +
                  listData[i].color +
                  ';margin-right: 5px;border-radius: 50%;}"></i><span style="width:70px; display:inline-block;">' +
                  listData[i].seriesName +
                  ': ' +
                  listData[i].data +
                  '</span><br>'
              }
              list.push(html)
              listItem = list.join('<br>')
              return '<div class="showBox">' + listItem + '</div>'
            }
          },
          grid: {
            left: '3%',
            right: '4%',
            // bottom: '5%',
            // containLabel: true
          },
          xAxis: {
            type: 'category',
            boundaryGap: false,
            data: eTimeArr,
            axisLabel: {
              textStyle: {
                color: "#2afcfd",
              },
            },
            axisLine: {
              lineStyle: {
                color: ["#2afcfd"],
                width: 0,
                type: "dashed",
              },
            },
            splitLine: {
              show: true,
              lineStyle: {
                color: ["#315070"],
                width: 1,
                type: "dashed",
              },
            },
          },
          yAxis: {
            type: 'value',
            min: 'dataMin',
            max: "dataMax",
            axisLabel: {
              textStyle: {
                color: "#fff",
              },
              boundaryGap: [0, '100%']
            },
            axisLine: {
              lineStyle: {
                onZero: false,
                color: ["#859fce"],
                // width: 0,
                // type: "dashed",
              },
            },
            splitLine: {
              show: true,
              lineStyle: {
                color: ["#315070"],
                width: 1,
                type: "dashed",
              },
            },
          },
          dataZoom: [
            {
              type: 'slider',
              show: true,
              xAxisIndex: [0],
              bottom: "auto",
            }
          ],
          toolbox: {
            feature: {
              brush: {
                title: {
                  lineX: '数据分析'
                }
              },
              //自定义关闭按钮
              myClear: {
                show: true,
                title: '退出分析',
                icon: 'path://M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2',
                onclick: function () {
                  //brush状态
                  chart.dispatchAction({
                    type: 'takeGlobalCursor'
                  });
                  //清除选区
                  chart.dispatchAction({
                    type: 'brush',
                    areas: []
                  });
                }
              },
            }
          },
          brush: {
            toolbox: ['lineX'],
            xAxisIndex: 0,
            throttleType: 'debounce',
            throttleDelay: 600,
            //『单击清除所有选框』
            removeOnClick: false
          },

          series: eSeriesArr
        };
        chart.setOption(option, true)

        //brush状态事件
        chart.on('globalcursortaken', onGlobalcursortaken);
        function onGlobalcursortaken(params) {
          //可以根据 params.brushOption.brushType = false 来判断是否退出刷选状态。此处无论进入或者退出状态都清空选取即可
          chart.dispatchAction({
            type: 'brush',
            areas: []
          });
        }

        chart.off("brushSelected");//解绑事件处理函数(可根据情况而定是否需要,这里我这边会重绘几次表,所以需要解绑事件处理函数)。
        chart.on('brushSelected', renderBrushed);

        function renderBrushed(params) {

          // console.log('renderBrushed', params);
          var brushed = [];
          var brushComponent = params.batch[0];
          var selArea = params.batch[0].areas[0] ? params.batch[0].areas[0].coordRange : ''

          var selIdxs = []
          var selTimes = []
          var selDatas = []
          for (var sIdx = selArea[0]; sIdx <= selArea[1]; sIdx++) {
            selIdxs.push(sIdx)
            selTimes.push(eTimeArr[sIdx])
          }

          eSeriesArr.forEach((e, i) => {
            var obj = {
              name: e.name,
              data: []
            }
            selDatas.push(obj)
            selIdxs.forEach(item => {
              selDatas[i].data.push(e.data[item])
            });
          });

          // console.log('selTimes', selTimes)
          // console.log('selDatas', selDatas)

          //最大值,最小值,最大相邻差,最大差值
          // var paramsArr = params.batch[0].selected
          // console.log('paramsArr', paramsArr)

          selDatas.forEach((e, i) => {
            e['startTime'] = selTimes[0]
            e['endTime'] = selTimes[selTimes.length - 1]
            e['maxVal'] = Math.max(...e.data)
            e['minVal'] = Math.min(...e.data)
            e['maxGap'] = maximumGap(e.data)
            e['maxDiff'] = maximunDiff(e.data)
          });

          // console.log('selDatas', selDatas)
          // console.log('params', params)

          if (selIdxs.length > 0) {
            chart.setOption({
              tooltip: {
                show: true,
                formatter: function (params) {
                  selDatas.forEach((e, i) => {
                    params.forEach((pe, pi) => {
                      if (e.name == pe.seriesName) {
                        e['color'] = pe.color
                      }
                    });
                  });

                  var list = []
                  var listItem = ''
                  var html = ''
                  html += '<span>' + selDatas[0].startTime + '~' + selDatas[0].endTime + '<span><br>'
                  selDatas.forEach((e, i) => {
                    if (e.color) {
                      html +=
                        "<div style='font-size: 14px; font-weight:bold;'>" +
                        "<div class='yuan' style='width: 12px;height: 12px;background: #ffffff;border-radius: 50%;display: inline-block;border: 3px solid " + e.color + "; '></div>" +
                        " 曲线: <span>" + e.name + "</span>" +
                        "</div>" +
                        "<p style='font-size: 12px;'>最大值: " + e.maxVal + "; 最小值: " + e.minVal + "</p>" +
                        "<p style='font-size: 12px;'>最大相邻差: " + e.maxGap + "; 最大差值: " + e.maxDiff + "</p>"
                    }
                  });
                  list.push(html)
                  listItem = list.join('<br>')
                  return '<div style="margin: 0px 10px 10px 10px; ">' + listItem + '</div>'
                },
              }
            });
          } else {
            chart.setOption({
              tooltip: {
                show: true,
                formatter: (params) => {
                  var listData = params
                  var list = []
                  var listItem = ''
                  var html = ''
                  html += '<span>' + listData[0].name + '<span><br>'
                  for (var i = 0; i < listData.length; i++) {
                    html += '<i style="display: inline-block;width: 10px;height: 10px;background: ' +
                      listData[i].color +
                      ';margin-right: 5px;border-radius: 50%;}"></i><span style="width:70px; display:inline-block;">' +
                      listData[i].seriesName +
                      ': ' +
                      listData[i].data +
                      '</span><br>'
                  }
                  list.push(html)
                  listItem = list.join('<br>')
                  return '<div class="showBox">' + listItem + '</div>'
                }
              }
            });
          }

          function maximumGap(nums) {
            if (nums) {
              if (nums.length < 2) return 0
              nums.sort((a, b) => a - b)
              let max = nums[1] - nums[0]
              for (let i = 0; i < nums.length - 1; i++) {
                max = Math.max(max, nums[i + 1] - nums[i])
              }
              return max.toFixed(2)
            }
          }

          function maximunDiff(arr) {
            var max = Math.max.apply(null, arr);
            var min = Math.min.apply(null, arr);
            return (max - min).toFixed(2);
          }
          // brushSelected over 
        }
        //over
      },


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

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

相关文章

RISC-V IOPMP实际用例-Andes SoC‘s Rapid-k模型

安全之安全(security)博客目录导读 2023 RISC-V中国峰会 安全相关议题汇总 说明&#xff1a;本文参考RISC-V 2023中国峰会如下议题&#xff0c;版权归原作者所有。

GDB用法(一)

预备 测试代码 main.cpp #include <iostream> #include <vector> #include "student.h"using namespace std;int add(int a, int b) {return a b; }int main() {vector<int> v {1, 3};Student* s1 new Student("zz", 20);Student* …

电路学习+硬件每日学习十个知识点(40)23.8.20 (希腊字母读音,阶跃信号和冲激信号的关系式,信号的波形变换,信号的基本运算,卷积积分,卷积和)

文章目录 1.信号具有时间特性和频率特性。2.模拟转数字&#xff0c;抽样、量化、编码3.阶跃信号和冲激信号4.信号的波形变换&#xff08;时移、折叠、尺度变换&#xff09;5.信号的基本运算&#xff08;加减、相乘、微分与积分、差分与累加&#xff09;5.1 相加减5.2 相乘5.3 微…

Android JNI系列详解之AS创建Native C++项目

一、前提 Android Studio版本&#xff1a;Android Studio Electric Eel | 2022.1.1 Patch 1 二、创建Native C项目 1.新建项目 2.选择新建Native C项目 3.New Project 4.选择C标准库的支持版本 5.项目自带的默认生成的代码 6.buil.gradle中也自带了CMakeList的配置&#xff08;…

4、Spring之Bean生命周期源码解析(创建)

Spring最重要的功能就是帮助程序员创建对象(也就是IOC),而启动Spring就是为创建Bean对象做准备,所以我们先明白Spring到底是怎么去创建Bean的,也就是先弄明白Bean的生命周期。 Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的。 Bean生命周期流程图…

微服务dubbo

微服务是一种软件开发架构风格&#xff0c;它将一个应用程序拆分成一组小型、独立的服务&#xff0c;每个服务都可以独立部署、管理和扩展。每个服务都可以通过轻量级的通信机制&#xff08;通常是 HTTP/REST 或消息队列&#xff09;相互通信。微服务架构追求高内聚、低耦合&am…

Matlab图像处理-乘法运算

乘法运算 两幅图像进行乘法运算主要实现两个功能&#xff1a; 一是可以实现掩模操作&#xff0c;即屏蔽图像的某些部分&#xff1b; 二是如果一幅图像乘以一个常数因子&#xff0c;如果常数因子大于1&#xff0c;将增强图像的亮度&#xff0c;如果因子小于1则会使图像变暗。…

二、数学建模之整数规划篇

1.定义 2.例题 3.使用软件及解题 一、定义 1.整数规划&#xff08;Integer Programming&#xff0c;简称IP&#xff09;&#xff1a;是一种数学优化问题&#xff0c;它是线性规划&#xff08;Linear Programming&#xff0c;简称LP&#xff09;的一个扩展形式。在线性规划中&…

《入门级-Cocos2dx4.0 塔防游戏开发》---第七课:游戏界面开发(自定义Layer)

目录 一、开发环境 二、开发内容 2.1 添加资源文件 2.2 游戏MenuLayer开发 2.3 GameLayer开发 三、演示效果 四、知识点 4.1 sprite、layer、scene区别 4.2 setAnchorPoint 一、开发环境 操作系统&#xff1a;UOS1060专业版本。 cocos2dx:版本4.0 环境搭建教程&…

06.sqlite3学习——DQL(数据查询)(全)

目录 SQLite——DQL&#xff08;数据查询&#xff09; 数据集 select语句 条件查询 比较 确定范围 确定集合 like 查询记录 查询不重复的记录 排序和限制 排序 限制 聚合 聚合函数 语法 SQLite Group By详解 语法 实例 SQLite Having 子句 语法 实例 多…

BUUCTF [SWPU2019]Web1

​ 这是一道sql二次注入题目&#xff0c;但是注入点并不在登录处 注册一个用户然后登录 广告申请处进行sql注入 你会发现过滤了很多关键字 空格#information等等 这里用到了一些绕过技巧 使用 /**/ 代替空格 union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1…

Docker网络原理及案例详解

文章目录 简介Docker网络产生的过程Docker network的作用网络模式网络模式---bridge网络模式---host网络模式---none 自定义网络 简介 Docker网络实现容器之间通信和连接外部网络的功能,主要的网络连接方式有桥接网络&#xff08;Bridge Network、主机网络&#xff08;Host Ne…

详细了解G1、了解G1、G1垃圾收集器详解、G1垃圾回收器简单调优

4.详细了解G1&#xff1a; 4.1.一&#xff1a;什么是垃圾回收 4.2.了解G1 4.3.G1 Yong GC 4.4.G1 Mix GC 4.5.三色标记算法 4.6.调优实践 5.G1垃圾收集器详解 5.1.G1垃圾收集器 5.2.G1的堆内存划分 5.3.G1的运行过程 5.4.三色标记 5.4.1.漏标问题 5.5.记忆集与卡表 5.6.安全点与…

iconfont 图标在vue里的使用

刚好项目需要使用一个iconfont的图标&#xff0c;所以记录一下这个过程 1、iconfont-阿里巴巴矢量图标库 这个注册一个账号&#xff0c;以便后续使用下载代码时需要 2、寻找自己需要的图标 我主要是找两个图标 &#xff0c;一个加号&#xff0c;一个减号&#xff0c;分别加入到…

Python爬虫实战案例——第二例

某某美剧剧集下载(从搜索片名开始) 本篇文章主要是为大家提供某些电影网站的较常规的下载电影的分析思路与代码思路(通过爬虫下载电影)&#xff0c;我们会从搜索某部影片的关键字开始直到成功下载某一部电影。 地址&#xff1a;aHR0cHM6Ly93d3cuOTltZWlqdXR0LmNvbS9pbmRleC5od…

基于全新电脑环境安装pytorch的GPU版本

前言&#xff1a; 距离第一次安装深度学习的GPU环境已经过去了4年多&#xff08;当时TensorFlow特别麻烦&#xff09;&#xff0c;现在发现安装pytorch的GPU版本还是很简单方便的&#xff0c;流程记录如下。 安装步骤&#xff1a; 步骤一&#xff1a;官网下载Anaconda Free…

局域网中电脑共享文件给手机

学习资源&#xff1a; 局域网共享&#xff1a;这样设置&#xff0c;你可以轻松拷贝任何电脑的文件。_哔哩哔哩_bilibili 可以实现什么效果&#xff1f; 连接同一个WIFI&#xff0c;电脑端为服务端&#xff0c;提供共享文件&#xff0c;手机是客户端&#xff0c;可以读取服务端…

C语言——指针进阶(一)

目录 ​编辑 一.字符指针 1.1 基本概念 1.2 面试题 二.指针数组 三.数组指针 3.1 数组指针的定义 3.2 &数组名VS数组名 3.3 数组指针的使用 四.数组参数、指针参数 4.1 一维数组传参 ​编辑 4.2 二维数组传参 4.3 一级指针传参 4.4 二级指针传参 ​编辑 五.…

windows系统 Fooocus 图片生成模型 ,4-6GB显存即可玩,27S/p

安装步骤: 1.下载程序代码框架,大小2GB ,下载 ​​​​​​https://github.com/lllyasviel/Fooocus/releases/download/1.0.35/Fooocus_win64_1-1-1035.7z 2.下载模型文件sd_xl_base_1.0_0.9vae.safetensors ,大小6GBhttps://huggingface.co/stabilityai/stable-diffusion-x…

软件配置安装(破解)--- maven下载配置

检查环境是否已有 首先检查一下电脑里有无maven环境&#xff0c;有的话就不用安装了 查看path环境中没有maven&#xff0c;开始准备接下来的重头戏 下载maven 下载bin.zip版 解压mavenxxxbin.zip &#xff08;建议把解压的文件放在一个文件夹内&#xff0c;命名英文的env…