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); // 手动清除框选状态
              }
            })
          }
        }
      });
 
相关推荐
FreeTinker5 小时前
HTML本地存储技术解析:localStorage与sessionStorage的原理、差异与应用场景
前端·html
qq_452396235 小时前
第十二篇:《全链路监控与可观测性:前端错误追踪与性能分析》
前端
海兰6 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(三)
javascript·python·金融
wangruofeng6 小时前
Phosphor Icons 官网源码拆解:URL 即存储、水波动画与 7362 Star 图标库的架构实践
前端·架构·github
BigTopOne6 小时前
WebRTC Native / Android 开发学习资源整理
前端
excel7 小时前
nuxt 3 升级 nuxt 4 报错之 hasInjectionContext
前端
小磊哥er7 小时前
深入解构Claude Code - 第 7 篇 · 连接外面的世界
javascript·ai编程
何以解忧,唯有..8 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
小磊哥er8 小时前
深入解构Claude Code - 第 6 篇 · 终端里的图形界面
javascript·ai编程
海兰8 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(一)
javascript·python·金融