echarts折线图矩形选择 框选图表

html 复制代码
 <div
      id="performaceLineChart"
      ref="performaceLineChartRef"
      style="width: 100%; height: 500px"
    ></div>
javascript 复制代码
 initLineChart() {
      var chartDom = document.getElementById("performaceLineChart");
      this.chart = echarts.init(chartDom);
      let that = this
      let option = {
        color: [],
        toolbox: {
          top: "0",
          right: "10",
          itemSize: 18,
          iconStyle: {
            borderColor: "#aeaeae",
            borderWidth: 2,
          },
          feature: {
            brush: {
              type: ['rect'], // ['rect','polygon','lineX', 'lineY','keep','clear'],
              title: {
                rect: '矩形选择',
              },
              xAxisIndex: 0,
            },
            saveAsImage: {
              title: "导出图片",
              name: `${this.basicInfoData.shortName}-业绩表现(${this.selectLabel})`
            },
            // dataZoom: [{  // 区域缩放
            //   type: 'inside',
            //   start: 0,
            //   end: 100,
            // }],
            // restore: {},  // 还原
          },
        },
        brush: {
          toolbox: ['rect'], // ['rect','polygon','lineX', 'lineY','keep','clear'],
          xAxisIndex: 0,
        },
        tooltip: {
          trigger: "axis",
          backgroundColor: 'rgba( 0, 0, 0,0.7)',
          borderColor: 'rgba( 0, 0, 0,0.7)',
          formatter: function (params) {
            var str = params[0].name + "</br>";
            for (let item of params) {
              str =`
              <span style='color: #fff;'>${str}</span>
              ${item.seriesName === '单位净值' ? '</br>' : ''} 
              <div style='display:flex;justify-content:space-between;'>
                <div style='display:flex;'>
                  <div>${item.marker}</div>
                  <div style='color: #fff;width: 200px;white-space: normal;'>${item.seriesName}</div>
                </div>
                &nbsp;&nbsp;&nbsp;&nbsp;
                <div style='color: #fff;'>${item.value}${item.seriesName !== '单位净值' ? '%' : ''}</div>
              </div>`;
            }
            return str;
          },
        },
        legend: {
          x: "center",
          y: "bottom",
          icon: "circle",
          textStyle: {},
          data: this.lengengData,
        },
        grid: {
          left: "0.5%",
          right: "1%",
          bottom: "15%",
          containLabel: true,
        },
        xAxis: {
          type: "category",
          boundaryGap: false,
          axisLabel: {},
          axisLine: {
            show: true,
            lineStyle: {},
            onZero: false, // X轴线始终位于底部
          },
          splitLine: {
            show: false,
          },
          data: this.performaceLineChartData.dataDates,
        },
        yAxis:[
          {
            type: "value",
            scale: true,
            splitNumber: 5,
            alignTicks: true,
            axisLabel: {
              show: true,
              formatter: (value) => {
                return `${value.toFixed(1)}%`
              }
            },
            axisLine: {
              show: false,
            },
            splitLine: {
              show: true,
              lineStyle: {
                type: "dotted",
              },
            },
          },
          {
            type: "value",
            splitNumber: 5,
            axisLabel: {
              show: true,
              formatter: (value) => {
                return `${value}%`
              }
            },
            axisLine: {
              show: false,
            },
            splitLine: {
              show: true,
              lineStyle: {
                type: "dotted",
              },
            },
          },
          {
            type: "value",
            splitNumber: 5,
            alignTicks: true,
            axisLabel: {
              show: true,
              formatter: (value) => {
                return `${value.toFixed(1)}%`
              }
            },
            axisLine: {
              show: false,
            },
            splitLine: {
              show: true,
              lineStyle: {
                type: "dotted",
              },
            },
          },
          {
            type: "value",
            splitNumber: 5,
            axisLabel: {
              show: true,
              formatter: (value) => {
                return `${value}%`
              }
            },
            axisLine: {
              show: false,
            },
            splitLine: {
              show: true,
              lineStyle: {
                type: "dotted",
              },
            },
          },
        ],
        series: this.seriesData,
      }
      this.chart.setOption(option, true);

      this.chart.on('brushEnd', function (params) {
        // console.log(params,'brushEnd');
        if (params.areas && params.areas.length > 0) {
          let xData = params.areas[0].coordRange[0]
          // 拿到框选的开始日期和结束日期
          that.selectStartDate = that.performaceLineChartData.dataDates[xData[0]]
          that.selectEndDate = that.performaceLineChartData.dataDates[xData[1]]
          if (that.selectStartDate && that.selectEndDate) {
            let params1 = {
              fundCode: that.fundCode,
              dataDate: that.dateValue,
              displayType: '0', // displayType 固定传 '0'
              indexCode: that.flag ? '' : '0', // indexCode 默认传 '',切换超额收益后 indexCode 传 '0'
              startDate: that.selectStartDate, // 框选的开始日期
              endDate: that.selectEndDate, // 框选的结束日期
            }
            // 获取框选日期区间数据
            getPortfolioNameApi.getCustomize(params1).then((res) => {
              if(res.code === 200) {
                that.selectIntervalData = res.data
                // 区间数据框处于图表中间位置
                let defaultDialog = document.querySelector('#intervalStyle')
                let chartWidth = that.$refs.performaceLineChartRef.offsetWidth
                defaultDialog.style.left = chartWidth / 2 - 182 + 'px'
                defaultDialog.style.top = 40 + 'px'
                that.intervalVisible = true
                // that.chart.setOption(option,true); // 手动清除框选状态
              }
            })
          }
        }
      });
    },

关键代码是:

javascript 复制代码
 brush: {
    toolbox: ['rect'], // ['rect','polygon','lineX', 'lineY','keep','clear'],
    xAxisIndex: 0,
 },
 this.chart.on('brushEnd', function (params) {
        // console.log(params,'brushEnd');
        if (params.areas && params.areas.length > 0) {
          let xData = params.areas[0].coordRange[0]
          // 拿到框选的开始日期和结束日期
          that.selectStartDate = that.performaceLineChartData.dataDates[xData[0]]
          that.selectEndDate = that.performaceLineChartData.dataDates[xData[1]]
          if (that.selectStartDate && that.selectEndDate) {
            let params1 = {
              fundCode: that.fundCode,
              dataDate: that.dateValue,
              displayType: '0', // displayType 固定传 '0'
              indexCode: that.flag ? '' : '0', // indexCode 默认传 '',切换超额收益后 indexCode 传 '0'
              startDate: that.selectStartDate, // 框选的开始日期
              endDate: that.selectEndDate, // 框选的结束日期
            }
            // 获取框选日期区间数据
            getPortfolioNameApi.getCustomize(params1).then((res) => {
              if(res.code === 200) {
                that.selectIntervalData = res.data
                // 区间数据框处于图表中间位置
                let defaultDialog = document.querySelector('#intervalStyle')
                let chartWidth = that.$refs.performaceLineChartRef.offsetWidth
                defaultDialog.style.left = chartWidth / 2 - 182 + 'px'
                defaultDialog.style.top = 40 + 'px'
                that.intervalVisible = true
                // that.chart.setOption(option,true); // 手动清除框选状态
              }
            })
          }
        }
      });
 
相关推荐
工业涂料百问2 分钟前
【趋势前沿】系列(三)工业涂料国产替代的三个台阶:航空、海工、电子的突破路径与认证壁垒
前端
前端snow11 分钟前
ai agent --- agentic RAG
前端
gyratesky24 分钟前
记录一种很新的大屏开发方式
前端·数据可视化
xy34531 小时前
Axure 9.0 中继器核心结构
前端·ui·html·axure·原型·产品设计
老王以为1 小时前
走进 AI Agent 第四篇(上):知识获取管道——RAG 基础
前端·人工智能·全栈
夏天要喝冰可乐2 小时前
一处写作,多平台分发:我给掘金做了一款开源 Chrome 插件
前端·chrome·vibecoding
货拉拉技术2 小时前
货拉拉开源Hadice:安卓 & 鸿蒙桌面调试工具
前端
程序猿DD3 小时前
OctaFuse Gateway 2.11.0:流式请求优化、用户折扣策略与错误契约升级
前端·后端
尾善爱看海3 小时前
《JavaScript 数组操作全攻略:12 类 API + 30 个实战场景 + 20 个避坑指南》
前端·javascript·面试