echarts 多toolti同时触发图表实现
- 需求背景
- 解决效果
- ISQQW代码地址
- energyChart.vue
需求背景
需要实现同x轴,4个图表的的多图表联动效果,且滑动会触发各个图表的tooltip,即一个图表拥有4个tooltip(目前echarts不支持,我这里绕过了这个问题)
解决效果
ISQQW代码地址
由于ISQQW只能上传一个option对象的图表,故未上传
energyChart.vue
<!--/**
* @author: liuk
* @date: 2023/11/21
* @describe: 能耗分析图表
* @email:https://blog.csdn.net/hr_beginner?spm=1018.2226.3001.5343
*/-->
<template><div ref="chatDom1" class="energyChart"></div><div ref="chatDom2" class="energyChart"></div><div ref="chatDom3" class="energyChart"></div><div ref="chatDom4" class="energyChart"></div>
</template><script lang="ts" setup>
import {ref, onMounted, watch, nextTick} from "vue"
import * as echarts from 'echarts'
import {formatToFixed} from "@/utils/dictionary";// Props
const props = defineProps(['data'])
const myCharts = {// Vue3 使用 proxy 对象代理,而 echarts 则使用了大量的全等(===), 对比失败从而导致了bug。myChart1: null,myChart2: null,myChart3: null,myChart4: null
}const chatDom1 = ref(null)
const chatDom2 = ref(null)
const chatDom3 = ref(null)
const chatDom4 = ref(null)watch(() => props.data, (data) => {nextTick(() => {renderFn(myCharts.myChart1, {xData: data.heatRateHistory.map(item => item.time),yName: '度日数单耗 W/m²·℃',sData: data.heatRateHistory.map(item => formatToFixed(item.heatRate)),markLineVal: data.heatRateHistory[0]?.heatRate3 || 0,color: '#EB8F4A'})renderFn(myCharts.myChart2, {xData: data.flowPowerHistory.map(item => item.time),yName: '电单耗 W/m²',sData: data.flowPowerHistory.map(item => formatToFixed(item.power1)),markLineVal: data.flowPowerHistory[0]?.power3 || 0,color: '#BF97FF'})renderFn(myCharts.myChart3, {xData: data.flowPowerHistory.map(item => item.time),yName: '水单耗 W/m²',sData: data.flowPowerHistory.map(item => formatToFixed(item.flow1)),markLineVal: data.flowPowerHistory[0]?.flow3 || 0,color: "#5690FF"})renderFn(myCharts.myChart4, {xData: data.energyAnalysisData.time,yName: '室外温度 °C',sData: data.energyAnalysisData.tt301_value_val_arr,markLineVal: false,color: '#00CCA3'})})
})onMounted(() => {drawChart(chatDom1.value, 1)drawChart(chatDom2.value, 2)drawChart(chatDom3.value, 3)drawChart(chatDom4.value, 4)echarts.connect('sameControls'); // **相同操作window.addEventListener('resize', () => {renderFn(myCharts.myChart1, {xData: props.data.heatRateHistory.map(item => item.time),yName: '度日数单耗 W/m²·℃',sData: props.data.heatRateHistory.map(item => formatToFixed(item.heatRate)),markLineVal: props.data.heatRateHistory[0]?.heatRate3 || 0,color: '#EB8F4A'})renderFn(myCharts.myChart2, {xData: props.data.flowPowerHistory.map(item => item.time),yName: '电单耗 W/m²',sData: props.data.flowPowerHistory.map(item => formatToFixed(item.power1)),markLineVal: props.data.flowPowerHistory[0]?.power3 || 0,color: '#BF97FF'})renderFn(myCharts.myChart3, {xData: props.data.flowPowerHistory.map(item => item.time),yName: '水单耗 W/m²',sData: props.data.flowPowerHistory.map(item => formatToFixed(item.flow1)),markLineVal: props.data.flowPowerHistory[0]?.flow3 || 0,color: "#5690FF"})renderFn(myCharts.myChart4, {xData: props.data.energyAnalysisData.time,yName: '室外温度 °C',sData: props.data.energyAnalysisData.tt301_value_val_arr,markLineVal: false,color: '#00CCA3'})}, {passive: true});
})const renderFn = (myChart, {xData, yName, sData, markLineVal, color}) => {const option = myChart.getOption()option.xAxis[0].data = xDataoption.xAxis[0].min = nulloption.yAxis[0].name = yNameoption.series[0].name = yNameoption.series[0].data = sDataoption.series[0].color = coloroption.series[0].markLine.data[0].yAxis = markLineValoption.series[0].markLine.data[0].label.color = colorif (markLineVal === false) delete option.series[0].markLineoption.tooltip[0].formatter = (param) => {const data = param[0] || {}const temp = data.data - markLineValconst [name, unit] = yName.split(" ")const nameArr = [{name,num: data.data},{name: '基准年' + name,num: markLineVal},{name: '对比基准年',num: temp}]return `${nameArr.map((item, i) => {return `<p class="energyChart-item"><i class="icon" style="color:${i === 3 ? '#fff' : data.color}">${new Array(1).fill('').map(() => {switch (i) {case 0:return '一'case 1:return '···'case 2:return temp > 0 ? '↑' : '↓'}})[0]}</i><span class="name">${item.name}</span><span>${formatToFixed(item.num)}</span><span>${unit}</span></p>`}).join("")}`}myChart.clear()myChart.setOption(option)
}const drawChart = (chatDom, n) => {let chartDom = chatDomif (chartDom == null) {return}echarts.dispose(chartDom)myCharts['myChart' + n] = echarts.init(chartDom)myCharts['myChart' + n].group = 'sameControls';const option = {grid: [{top: 29,left: 90,right: 90,height: 100},],axisPointer: {type: 'shadow',link: {xAxisIndex: 'all'},},tooltip: {trigger: 'axis',backgroundColor: 'rgba(61,57,48,0.8)',borderColor: 'rgba(149,149,149,0.8)',textStyle: {color: '#fff'},},xAxis: [{data: ['08:00', '09:00', '10:00', '11:00', '12:00', '13:00', '14:00', '15:00', '16:00', '17:00', '18:00', '19:00', '20:00', '21:00', '22:00', '23:00', '00:00', '01:00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00'],boundaryGap: false,axisLine: {show: true,onZero: false,},min: 'dataMin',axisTick: {show: true,alignWithLabel: true,},axisLabel: {show: true,color: 'rgba(165,166,166,1)',fontSize: '12',},}],yAxis: [{name: '度日数单耗 W/m²·℃',offset: 20,nameTextStyle: {padding: [0, 0, 0, -10],color: '#fff',fontSize: '14',opacity: 0.7,align: 'left',fontWeight: 'normal'},nameLocation: 'end',position: 'left',axisTick: {show: false},splitLine: {show: true,lineStyle: {type: 'dashed',color: 'rgba(52,52,52,1)'}},axisLine: {show: false,},axisLabel: {show: true,align: 'left',showMinLabel: false,color: 'rgba(165,166,166,1)',fontSize: '14',formatter: (val) => {switch (true) {case val < 1000:return valcase val >= 1e3 && val < 1e4:return (val / 1e3).toFixed(1) + 'k'default:return (val / 1e4).toFixed(1) + 'w'}}},},],series: [{name: '度日数单耗',type: 'line',symbol: 'image://',data: [-1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, -12, 13, 14, 15, 16, 17, 18, 19, -20, 21, 22, -23, 24],markLine: {symbol: "none",silent: true,data: [{yAxis: 5,label: {show: true,position: 'start',color: 'rgba(238,145,75,1)',}}]},lineStyle: {type: 'solid'}},]}option && myCharts['myChart' + n].setOption(option)
}
</script><style lang="scss" scoped>
.energyChart {width: 100%;height: 175px;margin-top: 5px;
}
</style>
<style lang="scss">
.energyChart-item {display: flex;align-items: center;margin: 10px 0;&:last-child {margin-bottom: 0;}.icon {display: inline-block;width: 12px;text-align: center;margin-right: 10px;}.name {display: inline-block;width: 120px;margin-right: 20px;}
}
</style>相关文章:
echarts 多toolti同时触发图表实现
需求背景解决效果ISQQW代码地址energyChart.vue 需求背景 需要实现同x轴,4个图表的的多图表联动效果,且滑动会触发各个图表的tooltip,即一个图表拥有4个tooltip(目前echarts不支持,我这里绕过了这个问题) 解决效果 ISQQW代码地…...
2023.11.22使用flask做一个简单的图片浏览器
2023.11.22使用flask做一个简单的图片浏览器 功能: 实现图片浏览(翻页)功能 程序页面: 程序架构: 注意:在flask中常会使用src“{{ url_for(‘static’, filename‘images/’ image) }}”,…...
万字解析设计模式之桥接模式、外观模式
一、桥接模式 1.1概述 桥接模式是一种结构型设计模式,它的作用是将抽象部分和实现部分分离开来,使它们能够独立地变化。这样,抽象部分和实现部分可以分别进行扩展,而不会相互影响。它是用组合关系代替继承关系来实现,…...
常用系统函数
$clog2 clogb2 系统函数 $clog2 应返回参数以 2 为底的对数的上限(对数四舍五入为整数值)。参数可以是整数或任意大小的向量值。参数应被视为无符号值,参数值为 0 将产生结果 0。 该系统函数可用于计算对给定大小的存储器进行寻址所…...
键盘控制ROS车运动
键盘控制ROS车运动 上位机 使用pyseria库与stm32单片机进行通信控制 #!/usr/bin/env python # -*- coding: utf-8 -*import sys, select, termios, tty import serialmsg """ ---------------------------w a x ds w : x a : y s : -x …...
linux上交叉编译qt库
linux上交叉编译qt库 Qt程序从X86平台Linux移植到ARM平台Linux需要做什么 1.在ubuntu上使用qt的源码交叉编译出Qt库 2.将编译好的库拷贝到开发板上并设置相应的环境变量(库路径啥的) 前两步一劳永逸,做一次就行 3.X86上写好程序代码&…...
Nacos介绍与使用
Nacos介绍与使用 文章目录 Nacos介绍与使用一. 什么是Nacos1 Nacos功能1.1 配置中心1.2 注册中心 2.为什么要使用Nacos 二.Nacos 部署安装1. Nacos 部署方式2. Nacos 安装3. 配置数据源4. 开启控制台授权登录(可选) 三. Nacos配置中心的使用1. 创建配置信…...
网工内推 | 字节原厂,正式编,网络工程师,最高30K*15薪
01 字节跳动 招聘岗位:网络虚拟化高级研发工程师 职责描述: 1、负责字节跳动虚拟网络产品的研发,包括但不局限于网络VPC、NAT、LB负载均衡等; 2、负责字节跳动网络基础平台的研发,包括但不局限于网络控制面系统、容器…...
Git 远程仓库(Github)
目录 添加远程库 查看当前的远程库 提取远程仓库 推送到远程仓库 删除远程仓库 Git 并不像 SVN 那样有个中心服务器。 目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员…...
Mybatis Plus分页实现逻辑整理(结合芋道整合进行解析)
Mybatis Plus分页实现逻辑整理(结合芋道整合进行解析) 我希望如春天般的你,身着白色的婚纱,向我奔赴而来,我愿意用全世界最温情的目光,朝着你的方向望去——姗姗来迟。 1.背景介绍 https://baomidou.com/p…...
C#编程题分享(2)
输出所有整数的和 让⽤户输⼊整数,如果⽤户输⼊的不是0,就继续输⼊,如果输⼊的是0,结束整数,并输出所有整数的和。 Console.WriteLine("请输⼊⼀个整数:"); int n; int sum 0; do {n Convert…...
Dockerfile基础
前言 知识点整理 Dockerfile 简介 它是一个没有后缀名的文本文档,里面是组合镜像的一些命令,Docker build命令构建镜像时,通过读取Dockerfile中的指令的顺序(自上到下)自动生成镜像。 Dockerfile 命令 1. FROM 指…...
python+selenium实现web自动化(基础入门)
selenium 是一个自动化操控工具,支持对web端进行自动化操控,从而实现自动化测试。 相关文档: https://python-selenium-zh.readthedocs.io/zh-cn/latest/https://www.selenium.dev/documentation/ 安装配置 环境依赖: python…...
Spring Boot 自动配置
1. Spring Boot 自动配置 Spring Boot的自动配置是其核心特性之一,旨在简化Spring应用程序的配置过程。这个特性通过合理的默认值以及根据类路径和其他因素自动配置Spring Beans来极大地减少了配置的工作量。以下是Spring Boot自动配置的详细讲解: 基本…...
力扣labuladong一刷day13天双指针8道链表题
力扣labuladong一刷day13天双指针7道链表题 一、21. 合并两个有序链表 题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/ 思路:合并只需要新new一个虚拟头结点,然后遍历比较两个链表把较小的那一个顺序接在虚拟头结点后面。…...
【剑指offer|图解|链表】链表的中间结点 + 链表中倒数第k个结点
🌈个人主页:聆风吟 🔥系列专栏:数据结构、算法模板 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️链表的中间结点二. ⛳️链表中倒数第k个结点📝结语 Ὄ…...
被环境变量虐过一遍获得的启示
Oracle数据库环境存在两个数据库版本12C及19C,在执行一些操作时需要设置对应版本的环境变量 计划登录12C环境,于是按如下方式设置环境变量 export ORACLE_BASE/u01/app/oracle export ORACLE_HOME$ORACLE_HOME/product/12.2.0/dbhome_1 export ORACLE_S…...
关于Hbase的一些问题
HBase 1. RowKey如何设计,设计不好会产生什么后果 唯一原则:在设计上要保持RowKey的唯一性。 因为HBase中的数据是以KV的格式来存储的,所以如果向同一张表中插入RowKey相同的数据,旧的数据会被覆盖掉。 长度原则:建…...
level=warning msg=“failed to retrieve runc version: signal: segmentation fault“
安装docker启动后,发现里面没有runc版本信息 目前看是少了runc组件 那我们安装runc https://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64 [rootlocalhost ~]# mv runc.amd64 /usr/bin/runc mv:是否覆盖"/usr/bin/runc&q…...
电力工作记录仪、智能安全帽、智能布控球助力智能电网建设
电力行业的建设和发展是国家经济发展的重要支撑,而智能电网作为电力系统的重要组成部分,它的安全高效运行关乎到整个电力系统乃至民生的稳定和安全。为了加快国家经济的发展以及满足人们对电力的需求和用电可靠性的要求,国家早在十二规划中就…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
