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
      },
相关推荐
Nejosi_念旧5 分钟前
TypeScript 泛型讲解
前端·javascript·typescript
layman052812 分钟前
vue——v-pre的使用
前端·javascript·vue.js
zizisuo31 分钟前
Java集合框架深度剖析:结构、并发与设计模式全解析
java·javascript·数据结构·设计模式
要加油哦~37 分钟前
刷题 | 牛客 - js中等题-下(更ing)30/54知识点&解答
java·开发语言·javascript
Python涛哥37 分钟前
前端流行框架Vue3教程:25. 组件保持存活
前端·javascript·vue.js
Hello-Mr.Wang1 小时前
基于 Vue3 与 exceljs 实现自定义导出 Excel 模板
前端·vue.js·excel
Raink老师1 小时前
1.3 如何安装 TypeScript?
前端·javascript·typescript
ST_小罗2 小时前
【Web前端】JavaScript入门与基础(二)
开发语言·前端·javascript
Greatlifeee2 小时前
VUE3+TS实现图片缩放移动弹窗
前端·javascript·vue.js
恰恰兄2 小时前
base 西安 | 前端面试问题汇总 (2023年8月)
前端·面试·职场和发展