echarts有4个y轴,点击图例依次按顺序显示和隐藏

news2024/11/30 2:43:46

代码:

<template>
  <div>
    <el-row class="actually" style="padding-top:10px;height: 420px;">
      <div style="font-size: 14px; font-weight: bold; margin: 0 10px 0 5px; display: inline-block">
        Cloud Usage
      </div>
      <span style="font-size: 12px; line-height: 20px">Date: {{ formlist.startdate.slice(0, 10) }}~{{
        formlist.endate.slice(0, 10) }}</span>
      <div v-show="empty" v-loading="showCloudUsageLoading">
        <div id="usage" style="height: 400px"></div>
      </div>
      <div v-show="!empty" class="tabempty" style="height: 420px; line-height: 420px">
        <p>No Data</p>
      </div>
    </el-row>
  </div>
</template>
 
<script type="text/ecmascript-6">
import { dateFormat } from "@/utils/time";
export default {
  name: "usage",
  props: ['formlist', 'monthData'],
  filters: {
    divnum(val) { //数字每三位进行逗号分割
      if (val) {
        let str = val.toString(); //转换为字符串
        let reg = str.indexOf(".") > -1 ? /(\d)(?=(\d{3})+\.)/g : /(\d)(?=(?:\d{3})+$)/g; //定义正则类型
        return str.replace(reg, "$1,");
      } else {
        return '0';
      }
    },
    divtime(val) { //日期格式转换
      if (val) {
        return dateFormat(val, "yyyy-MM-dd");
      } else {
        return '';
      }
    },
  },
  data() {
    return {
      type: '',
      empty: true,
      showCloudUsageLoading: true,
    };
  },
  watch: {
    monthData(newVal, oldVal) {
      if (newVal) {
        this.showCloudUsageLoading = false
        this.creatactualbar();
      }
    }
  },
  mounted() {
  },
  methods: {
    // 自定义升序比较函数
    compareDates(a, b) {
      const dateA = new Date(a.startDate);
      const dateB = new Date(b.startDate);
      if (dateA < dateB) {
        return -1;
      } else if (dateA > dateB) {
        return 1;
      }
      return 0;
    },
    /*绘制折线图表*/
    creatactualbar() {
      let chartDom = document.getElementById('usage');
      let myChart = this.$echarts.init(chartDom);
      let option = {
        color: ["#7B8399", "#7B735D", "#5F769C", "#333942"],
        tooltip: {
          trigger: 'axis',
          formatter: function (params) {
            let tooltip = params[0].name + '<br>';
            for (let i = 0; i < params.length; i++) {
              let seriesName = params[i].seriesName;
              let seriesValue = params[i].value;
              if (option.yAxis[i + 1].show) { // 判断y轴是否显示
                tooltip += seriesName + ':' + seriesValue + '<br>';
              }
            }
            return tooltip;
          }
        },
        legend: {
          x: 'center',
          y: '6%',
          data: [
            { name: 'CO2e(metric tons)', icon: 'circle' },
            { name: 'Kilowatt Hours(kWh)', icon: 'circle' },
            { name: 'Cost(¥)', icon: 'circle' },
            { name: 'Unit CO2e(metric mg)', icon: 'circle' },
          ],
          textStyle: {
            color: "#444444",
            fontsize: 25
          },
          selected: {
            'CO2e': false,
            'Kilowatt Hours': true,
            'Cost': true,
            'Unit CO2e': false,
          }
        },
        grid: {
          top: '25%',
          left: '45',
          right: '100',
          bottom: '5%',
          containLabel: true,
          splitArea: {
            show: true,
            interval: 'auto' // 设置网格区域的间隔
          }
        },
        xAxis: {
          type: 'category',
          boundaryGap: true,
          data: [],
          axisLabel: {
            interval: 0,
            rotate: -45
          }
        },
        yAxis: [
          {
            type: 'value',
            name: 'CO2e',
            nameTextStyle: {
              padding: [0, 0, 0, -25]
            },
            axisLine: {
              lineStyle: {
                color: '#7B8399'
              }
            },
            splitLine: {
              show: false
            },
            splitNumber: 5,
            axisTick: {
              inside: true,
              length: 10
            },
          },
          {
            type: 'value',
            name: 'Kilowatt Hours',
            nameTextStyle: {
              padding: [0, 0, 0, 25]
            },
            axisLine: {
              lineStyle: {
                color: '#7B735D'
              }
            },
            splitLine: {
              show: false
            },
            splitNumber: 5,
            axisLabel: {
              formatter: '{value}'
            },
            axisTick: {
              inside: true,
              length: 10
            },
            offset: 0,
            position: 'center',
          },
          {
            type: 'value',
            name: 'Cost',
            nameTextStyle: {
              padding: [0, 0, 0, 50]
            },
            axisLine: {
              lineStyle: {
                color: '#5F769C'
              }
            },
            splitLine: {
              show: false
            },
            splitNumber: 5,
            axisLabel: {
              formatter: '{value}'
            },
            axisTick: {
              inside: true,
              length: 10
            },
            offset: 60,
            position: 'center',
          },
          {
            type: 'value',
            name: 'Unit CO2e',
            nameTextStyle: {
              padding: [0, 0, 0, 35]
            },
            axisLine: {
              lineStyle: {
                color: '#333942'
              }
            },
            splitLine: {
              show: false
            },
            splitNumber: 5,
            axisLabel: {
              formatter: '{value}'
            },
            offset: 150,
            position: 'center',
            axisTick: {
              inside: true,
              length: 10
            }
          }
        ],
        series: [
          {
            name: 'CO2e(metric tons)',
            type: 'line',
            data: [],
            yAxisIndex: 0
          },
          {
            name: 'Kilowatt Hours(kWh)',
            type: 'line',
            data: [],
            yAxisIndex: 1
          },
          {
            name: 'Cost(¥)',
            type: 'line',
            data: [],
            yAxisIndex: 2
          },
          {
            name: 'Unit CO2e(metric mg)',
            type: 'line',
            data: [],
            yAxisIndex: 3
          }
        ]
      };
      // 处理数据
      const startDates = this.monthData.map(item => item.date)
      const co2es = this.monthData.map(item => item.co2e)
      const khs = this.monthData.map(item => item.KH)
      const costs = this.monthData.map(item => item.cost)
      const units = this.monthData.map(item => item.totalUnitCo2e)
      // 按天查詢需要隱藏UnitCo2e line
      let deepCopyOption = JSON.parse(JSON.stringify(option))
      let count = 0
      for (let i = 0; i < units.length; i++) {
        if (units[i] === "") {
          ++count;
        }
      }
      if (count !== 0) {
        // deepCopyOption.tooltip.formatter = '{b}' + '<br>' + '{a0}:{c0}' + '<br>' + '{a1}:{c1}' + '<br>' + '{a2}:{c2}';
        deepCopyOption.color.pop();
        deepCopyOption.legend.data.pop();
        deepCopyOption.yAxis.pop();
        deepCopyOption.series.pop();
      }
      // x轴
      deepCopyOption.xAxis.data = startDates
      // y轴 - CO2e
      deepCopyOption.series[0].data = co2es
      // y轴 - Kilowatt Hours
      deepCopyOption.series[1].data = khs
      // y轴 - Cost
      deepCopyOption.series[2].data = costs
      // y轴 - Unit Co2e
      if (count === 0) deepCopyOption.series[3].data = units
 
      deepCopyOption && myChart.setOption(deepCopyOption);
      // 添加legendselectchanged事件处理函数(兼容点击图例name不隐藏问题)
 
      myChart.on('legendselectchanged', function (params) {
        let selected = params.selected;
        let yAxis = deepCopyOption.yAxis;
        const name = {
          0: 'CO2e(metric tons)',
          1: 'Kilowatt Hours(kWh)',
          2: 'Cost(¥)',
          3: 'Unit CO2e(metric mg)',
        }
        let offsetStep = 90; // 每个y轴的偏移值步长
        let totalOffset = 0; // 总偏移值
        for (let i = 0; i < yAxis.length; i++) {
          let yAxisName = name[i];
          yAxis[i].show = selected[yAxisName]; // 根据图例的选中状态设置Y轴的显示和隐藏
          if (yAxis[i].show && i !== 0) {
            yAxis[i].offset = totalOffset;
            totalOffset += offsetStep;
          } else {
            yAxis[i].offset = 0;
          }
        }
        myChart.setOption(deepCopyOption);
      })
    }
  }
}
</script>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1165945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建生成式AI应用:关键因素是什么?

原创 | 文 BFT机器人 生成式AI是一种基于机器学习和深度学习的技术&#xff0c;通过训练模型来生成新的内容&#xff0c;它可以通过学习现有的数据&#xff0c;理解其规律和特征&#xff0c;并生成与之类似的新内容&#xff0c;生成式AI在多个领域具有广泛的应用潜力。然而&am…

vue3+element Plus实现弹框的拖拽、可点击底层页面功能

1、template部分 <el-dialog:modal"false"v-model"dialogVisible"title""width"30%"draggable:close-on-click-modal"false"class"message-dialog"> </el-dialog> 必须加的属性 modal:是否去掉遮罩层…

【踩坑及思考】浏览器存储 cookie 最大值超过 4kb,或 http 头 cookie 超过限制值

背景 本地生产环境&#xff1a;超过最大值 cookie token 不存储&#xff1b;客户生产环境&#xff1a;打开系统空白&#xff0c;且控制台报 http 400 错误&#xff1b; 出现了两种现象 现象一&#xff1a;浏览器对大于 4kb 的 cookie 值不存储 导致用户名密码登录&#xff…

kill-port,跨平台解决端口占用问题

在日常开发中&#xff0c;端口占用问题一直是令人头疼的难题。为了更高效地管理端口资源&#xff0c;开发者们经常需要一种快速而可靠的解决方案。在这方面&#xff0c;kill-port 的出现为我们提供了一种强大而便捷的工具。本篇博客将深入介绍 kill-port 解决端口占用问题的优势…

Marp: 将 Markdown 变为 PPT 式样的 VScode 插件

样例代码&#xff1a; --- marp: true size: 16:9 theme: default header: footer: --- <!-- _footer: Jia ming<br>Gansu University of Political Science and Law --> <!-- _backgroundColor: lightskyblue --> ## <!-- fit --> 笔记检验概述>…

Django音乐电台推荐系统 毕业设计-附源码 00750

摘要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作规…

c++的vector按值删除元素

代码 #include<iostream> #include<vector> using namespace std;void testDelete(vector<int>& vec, const bool delete45, const bool delete_less7) {if (delete45 true) {vec.erase(std::remove(vec.begin(), vec.end(), 45), vec.end());}if (del…

python加上ffmpeg实现音频分割

前言: 这是一个系列的文章,主要是使用python加上ffmpeg来对音视频文件进行处理,包括音频播放、音频格式转换、音频文件分割、视频播放等。 系列文章链接: 链接1: python使用ffmpeg来制作音频格式转换工具(优化版) 链接2:<Python>PyQt5+ffmpeg,简单视频播放器的编写(…

Springboot配置knife4j类(knife4j的使用)

1.引言 1.1 Swagger介绍 前后端分离开发模式中&#xff0c;API文档是最好的沟通方式。Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。具有以下几个特点&#xff1a; 及时性 (接口变更后&#xff0c;能够及时准确地通知相…

揭秘!AI加持双十一电商盛宴,带你解锁更多营销新玩法

从2009年到2023年&#xff0c;每年年终的双11大促都是如期而至&#xff0c;而且几乎每一次双11都能给电商行业带来创新和改变。今年是中国电商行业的第15个双11&#xff0c;也是人工智能&#xff08;AI&#xff09;在电商领域大规模应用的第一个双11。在这15年的发展历程中&…

RoboFab:世界第一家人形机器人生产工厂,承诺每年将生产1万台高科技机器人

原创 | 文 BFT机器人 脑洞大开地想象一下&#xff1a;有一家能够制造像人类一样行走、奔跑和工作的人型机器人的工厂。这听起来像是科幻电影&#xff0c;但实际上它已经出现在现实中。 不久之前&#xff0c;初创企业Agility Robotics向大众宣布将在美国俄勒冈州开设一座占地约…

Vue 官网使用与环境搭建

vue官网网址&#xff1a;https://cn.vuejs.org/vue脚手架文档网址&#xff1a;https://cli.vuejs.org/zh/ vue团队为了使得vue更加好的使用&#xff0c;维护了一些文档。 API是vue的字典&#xff0c;在编写vue的时候&#xff0c;遇到了一些不会的方法那么就去找API&#xff0c…

【linux进程控制(一)】进程终止--如何干掉一个进程?

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程终止 1. 前言2. 文章整体…

uinapp微信小程序隐私政策授权

&#x1f680; 隐私弹窗效果图&#xff1a; 1、启用隐私相关功能在manifest.json文件中配置 usePrivacyCheck: true "mp-weixin" : {"__usePrivacyCheck__" : true, },2、创建组件 <template><view><!-- 隐私政策弹窗 --><uni-popu…

从瀑布模式到水母模式:ChatGPT引领软件研发的革新之路

ChatGPT引领软件研发的革新之路 概述操作建议本书优势 内容简介作者简介专家推荐读者对象目录直播预告写在末尾&#xff1a; 主页传送门&#xff1a;&#x1f4c0; 传送 概述 计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了…

CI523电动车NFC一键启动

Ci523是一颗工作在13.56MHz频率下的非接触式读写芯片&#xff0c;支持读A卡&#xff08;CI523支持读A/B卡&#xff09;&#xff0c;可做智能门锁、电动车NFC一键启动、玩具NFC开锁等应用。为部分要求低成本&#xff0c;PCB小体积的产品提供了可靠的选择。

WoShop跨境电商源码:支持多种货币转换,让购物更加便捷!

随着全球电子商务的飞速发展&#xff0c;跨境电商已经成为了众多企业的必然选择。然而&#xff0c;在跨国交易中&#xff0c;货币转换往往成为了一个令人头疼的问题。为了彻底解决这一难题&#xff0c;我们特别推出了一款支持多种货币转换的跨境电商源码&#xff0c;致力于为用…

大洋钻探系列之一引子

大洋科学钻探计划自1968年启动开始&#xff0c;迄今已有50余年&#xff0c;先后经历了&#xff14;个阶段。深海钻探计划(Deep Sea Drilling Program&#xff0c;DSDP&#xff0c;1968-1983年&#xff09;、国际大洋钻探计划&#xff08;Ocean Drilling Program&#xff0c;ODP…

内衣洗衣机和手洗哪个干净?最好用的迷你洗衣机推荐

内衣洗衣机是家里的一种重要电器&#xff0c;在日常生活中也能起到很大的作用。生活的压力太大了&#xff0c;不是所有人都有空闲的时间手洗自己的内衣、内裤。因此&#xff0c;内衣专用的洗衣机在这方面做得非常好。但是&#xff0c;目前市场上的内衣洗衣机品牌很多&#xff0…

JSPv2之El

​ (一)EL的基本语法 1优点 1 jsp的java太长了,el自己的语言${ 开始 }结束 2el直接返回空字符转,而java直接报错 3使用“lt”代替“<”运算符&#xff0c;如果运算符后面是数字&#xff0c;在运算符 *EL取值时&#xff0c;没有数组的下标越界&#xff0c;没有…