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); // 手动清除框选状态
              }
            })
          }
        }
      });
 
相关推荐
羽沢311 小时前
Canvas学习一
前端·css·学习·canvas
KaMeidebaby1 小时前
卡梅德生物技术快报|锦葵科植物遗传转化工程化优化:棉花胚尖农杆菌转化体系参数固化与效率提升
前端
invicinble1 小时前
前端框架使用vue-cli( 第二层:工程配置层--4.axios需要做的基础配置)
前端·vue.js·前端框架
MXN_小南学前端1 小时前
Vue + Element UI 分页器封装:比直接用 el-pagination 更省心的通用方案
javascript·vue.js·elementui
用户070455741291 小时前
第一次前后端联调后,我终于理解了什么是工程化
前端
亲亲小宝宝鸭1 小时前
Vue3中那些冷门但实用的方法
前端·vue.js
qq_349523261 小时前
分析原型到表的过程
前端
1 小时前
Pinia 全局状态管理
前端
M ? A1 小时前
Vue 转 React | VuReact 实时监听开发指南
前端·vue.js·后端·react.js·面试·开源·vureact