【echarts多y轴】通过接口获取参数后渲染echarts多y轴图

在这里插入图片描述
在这里插入图片描述

如题:准备工作如下:

  1. 首选准备好echarts图表的option项
// 接口层获取name,按照一左一右的原则,塞入left right的 position数值
export const yAxisSingle = (name = 'V', position = 'left') => {
   
   
  return {
   
   
    type: 'value',
    name,
    position,
    alignTicks: true,
    // offset: 80,
    axisLine: {
   
   
      show: true,
    },
  }
}
// 每一项的series,需要自己判断yAxisIndex是多少,默认取0
export const seriesSingle = (name, key, data = [], yAxisIndex = 0) => {
   
   
  return {
   
   
    type: 'line',
    name,
    key,
    data,
    yAxisIndex,
  }
}
// 初始化options总数据项
export const energyAnalysisOper = () => {
   
   
  return {
   
   
    xAxis: {
   
   
      type: 'category',
      data: []
    },
    yAxis: {
   
   
      type: 'value'
    }, // 这里应该是数组,但是为了初始化不报错就先用对象展示
    tooltip: {
   
   
      trigger: 'axis',
      axisPointer: {
   
   
        type: 'cross',
        label: {
   
   
          backgroundColor: '#6a7985'
        }
      }
    },
    grid: {
   
   
      left: '15%',
      right: '15%',
      // bottom: '23%',
    },
    legend: {
   
   
      type: 'scroll',
      x: 'center',
      y: 'bottom',
      data: [],
    },
    dataZoom: [
      {
   
   
        type: 'inside'
      },
    ],
    series: [
      // {
   
   
      //   type: 'line',
      //   name: i18n.t('plant.powerGeneration'),
      //   key: 'pvTotalEnergys',
      //   data: [],
      // },
    ]
  }
}
 <IEcharts
     v-adaptiveEcharts
     title="energyAnalysisOper"
     chartId="energyAnalysisOper"
     :option="energyAnalysisOper"
 />

// 接口层处理逻辑
getChartsFun(params) {
   
   
      this.operaEchartsLoading = true
      getCharts(params).then(res => {
   
   
        const {
   
    success, code, message, data } = res
        if (success || ['200'].includes(String(code))) {
   
   
          // energyAnalysisOper, yAxisSingle, seriesSingle,
          // 先取出unitMap,防止以后面计算报错
          const {
   
    unitMap } = data
          delete data.unitMap
          // 判断是否为空data,如果不是空data
          if (!_.isEmpty(data)) {
   
   
            const options = energyAnalysisOper() // 初始化echarts配置
            options.yAxis = [] // yAxis按照数组来匹配
            // 先处理y坐标轴的数据,按照去重规则,相同单位仅用一次
            const yAxisIndexObj = {
   
   }
            const unitMapFormatter = {
   
   }
            if(!_.isEmpty(this.yAxisObj)) {
   
   
              Object.keys(this.yAxisObj).forEach((key, index) => {
   
   
                if (this.yAxisObj[key]) {
   
   
                  // 处理y轴配置项,如果是偶数,则放在左侧,否则在右侧
                  const yAxisRow = yAxisSingle(key, index % 2 === 0 ? 'left' : 'right')
                  // 如果不是前两条y轴,再来两条y轴需要增加offset
                  if (index > 1) {
   
   
                    yAxisRow.offset = 60
                  }
                  options.yAxis.push(yAxisRow)
                  yAxisIndexObj[key] = index
                }
              }) 
            }
            // 字典需准备的值:国际化对应,单位, 对应坐标轴index
            Object.keys(data).forEach((key, index) => {
   
   
              // 如果当前是第一项,则处理一下横坐标数组,防止逻辑重复运行
              if (!index) {
   
   
                options.xAxis.data = Object.keys(data[key]).map(item => item)
              }
              // 设置对应坐标轴的data数据 分别为:国际化语言,key值,对应data数组,对应坐标轴
              options.series.push(seriesSingle(
                  this.checkedKeysFilterObj[key].label, 
                  key, 
                  Object.values(data[key]),
                  yAxisIndexObj[this.checkedKeysFilterObj[key].unit] || 0, 
                  // 0,
                  // unitMap[key],
              )),
              options.legend.data.push(this.checkedKeysFilterObj[key].label)
              unitMapFormatter[this.checkedKeysFilterObj[key].label] = unitMap[key]
            })
            options.tooltip.formatter = function (params) {
   
   
              let relVal = ''
              for (var i = 0, l = params.length; i < l; i++) {
   
   
                relVal += i ? '<br/>' : ''
                relVal += params[i].marker + "&nbsp;" + params[i].seriesName + '&nbsp;' + params[i].value+ '' + unitMapFormatter[params[i].seriesName]
              }
              return relVal
            }
            this.energyAnalysisOper = options
          }
        }
      }).finally(() => {
   
   
        this.operaEchartsLoading = false
      })
    },
// 数据mock
{
   
   
    "message": "成功",
    "code": 200,
    "data": {
   
   
        "pv1Voltage": {
   
   
            "01:55": 9.39,
            "18:50": 83.12,
            "02:25": 71.6,
            "08:05": 59.51,
            "02:20": 2.67,
            "07:35": 44.33,
            "08:00": 36.31,
            "20:10": 2.78,
            "07:30": 53.41,
            "01:50": 53.11,
            "14:15": 35.08,
            "13:45": 1.9,
            "20:05": 1.84,
            "19:25": 60.56,
            "14:10": 22.77,
            "19:20": 67.38,
            "13:40": 26.15,
            "18:55": 19.96,
            "02:15": 92.5,
            "01:45": 20.12,
            "19:30": 7.03,
            "07:25": 67.04,
            
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值