echarts 几千条分钟级别在小时级别图标上展示

  • 需求背景
  • 解决效果
  • ISQQW代码地址
  • strategyChart.vue

需求背景

需要实现 秒级数据几千条在图表上显示,(以下是 设计图表上是按小时界别显示数据,后端接口为分钟级别数据)
1232323

解决效果

在这里插入图片描述

ISQQW代码地址

链接

strategyChart.vue

<!--/**
* @author: liuk
* @date: 2023/11/21
* @describe: 描述
* @email:1229223630@qq.com
*/-->
<template>
  <div ref="chatDom" class="strategyChart"></div>
</template>

<script lang="ts" setup>
import {ref, onMounted, watch, nextTick} from "vue"
import * as echarts from 'echarts'

// Props
const props = defineProps(['data', 'type'])

let myChart = null // Vue3 使用 proxy 对象代理,而 echarts 则使用了大量的全等(===), 对比失败从而导致了bug。
const chatDom = ref(null)

watch(() => props.data, (data: any) => {
  nextTick(() => {
    const option = myChart.getOption()
    myChart.clear()
    myChart.setOption(renderFn(option, data, props.type))
  })
}, {deep: true})

onMounted(() => {
  drawChart()
  window.addEventListener('resize', () => {
    const option = myChart.getOption()
    myChart.clear()
    myChart.setOption(renderFn(option, props.data, props.type))
  }, {passive: true});
})

const renderFn = (option, data, type) => {
  switch (type) {
    case 1:
      option.legend[0].data = ['当前二供温', '目标二供温']
      option.yAxis[0].name = '单位/℃'
      option.series[0].name = '当前二供温'
      option.series[0].data = data.tt211_value
      option.series[0].color = '#3A68C0'
      option.series[1].name = '目标二供温'
      option.series[1].data = data.tt211_balanced_forecast
      option.series[1].color = '#FFBF00'
      option.series[1].lineStyle.type = 'dashed'
      return option
    case 2:
      option.legend[0].data = ['反馈阀开度', '设定阀开度', "预测阀开度"]
      option.yAxis[0].name = '单位/%'
      option.series[0].name = '反馈阀开度'
      option.series[0].data = data.cov121_value
      option.series[0].color = '#3A68C0'
      option.series[1].name = '设定阀开度'
      option.series[1].data = data.cov121_forecastset
      option.series[1].color = '#FFBF00'
      option.series[2].name = '预测阀开度'
      option.series[2].data = data.cip121_hz_forecast
      option.series[2].color = '#FFBF00'
      option.series[3] = {
        name: '',
        symbol: 'image://',
        type: 'line',
        color: '2c2c2c',
        showSymbol: false,
        connectNulls: false,
        data: curData,
        areaStyle: {
          color: '#2c2c2c'
        },
        lineStyle: {
          width: 2,
          type: 'dotted'
        },
      }
      return option
    case 3:
      option.legend[0].data = ['实际频率', '预测频率']
      option.yAxis[0].name = '单位/Hz'
      option.series[0].name = '实际频率'
      option.series[0].data = data.cip121_hz
      option.series[0].color = '#3A68C0'
      option.series[1].name = '预测频率'
      option.series[1].data = data.cip121_hz_forecast
      option.series[1].color = '#FFBF00'
      option.series[1].lineStyle.type = 'dashed'
      return option
  }
}
// 当前天 24小时数据
const curData = new Array(27).fill([]).map((_, i) => {
  const cur0Date = new Date(new Date().toLocaleDateString()).setHours(0) // 当天0点时间戳 秒级
  return [cur0Date + (i - 1) * 60 * 60 * 1000, '-']
})
const drawChart = () => {
  let chartDom = chatDom.value
  if (chartDom == null) {
    return
  }
  echarts.dispose(chartDom)
  myChart = echarts.init(chartDom)
  const option = {
    legend: {
      bottom: 0,
      data: [],
      textStyle: {
        color: '#929394'
      },
    },
    tooltip: {
      trigger: 'axis',
      borderColor: 'rgba(255,255,255,.1)',
      backgroundColor: 'rgba(149, 149, 149, 0.11)',
      extraCssText: '0px 2px 8px 0px rgba(0,0,0,0.3); backdrop-filter: blur(8px);',
      textStyle: {
        color: '#fff'
      },
    },
    grid: {
      left: '2.5%',
      top: '15%',
      right: '0.8%',
      bottom: '10%',
      containLabel: true
    },
    xAxis: [
      {
        type: 'time',
        show: true,
        axisLine: {
          show: true,
          lineStyle: {
            width: 2,
            color: 'rgba(80,80,80,1)'
          }
        },
        axisTick: {
          show: true,
          alignWithLabel: true, // 将刻度线与标签对齐
        },
        axisLabel: {
          color: 'rgba(165,166,166,1)',
          fontSize: '14',
          formatter: (val) => {
            const date = new Date(val)
            const isNow = date.getHours() === new Date().getHours()
            return isNow ? 'now' : String(date.getHours()).padStart(2, '0') + ':00'
          }
        },
        axisPointer: {
          label: {
            formatter: function (params) {
              const date = new Date(params.value)
              const y = date.getFullYear()
              const m = date.getMonth() + 1 < 10 ? ('0' + date.getMonth() + 1) : date.getMonth() + 1
              const d = date.getDate() < 10 ? ('0' + date.getDate()) : date.getDate()
              const hours = date.getHours() < 10 ? ('0' + date.getHours()) : date.getHours()
              const minutes = date.getMinutes() < 10 ? ('0' + date.getMinutes()) : date.getMinutes()
              var seconds = date.getSeconds()
              return `${y}-${m}-${d}` + ` ${hours}:${minutes}:${seconds}`
            }
          }
        },
      }
    ],
    yAxis: [
      {
        name: '单位/%',
        type: 'value',
        show: true,
        offset: 5,
        nameTextStyle: {
          padding: [0, 35, 10, 0],
          color: 'rgba(165,166,166,1)',
          fontSize: '12',
        },
        splitLine: {
          show: true,
          lineStyle: {
            type: 'dashed',
            color: 'rgba(52,52,52,1)'
          }
        },
        axisLabel: {
          color: 'rgba(165,166,166,1)',
          fontSize: '12',
        },
      }
    ],
    series: [
      {
        name: '反馈阀开度',
        symbol: 'image://',
        type: 'line',
        color: "rgba(255,191,0,1)",
        showSymbol: false,
        connectNulls: false,
        data: curData,
        areaStyle: {
          color: 'rgba(255,191,0,0)'
        },
        lineStyle: {
          width: 2,
          type: 'solid'
        },
      },
      {
        name: '设定阀开度',
        symbol: 'image://',
        type: 'line',
        color: 'red',
        showSymbol: false,
        connectNulls: false,
        data: curData,
        areaStyle: {
          color: 'rgba(255,191,0,0)'
        },
        lineStyle: {
          width: 2,
          type: 'solid'
        },
      },
      {
        name: '',
        symbol: 'image://',
        type: 'line',
        color: '2c2c2c',
        showSymbol: false,
        connectNulls: false,
        data: curData,
        areaStyle: {
          color: '2c2c2c'
        },
        lineStyle: {
          width: 2,
          type: 'dotted'
        },
      },
    ]
  }
  option && myChart.setOption(option)
}
</script>

<style lang="scss" scoped>
.strategyChart {
  width: 100%;
  height: 100%;
  margin-top: 5px;
}
</style>
<style lang="scss">
.detailChat-popup {
  overflow: hidden;
  margin: 3px 10px;

  .top {
    margin-bottom: 16px;
  }

  .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 {
      margin-right: 20px;
    }
  }
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

02房价预测

目录 代码 评分算法&#xff1a; 代码 import numpy as np from sklearn import datasets from sklearn.linear_model import LinearRegression# 指定版本才有数据集 # C:\Users\14817\PycharmProjects\pythonProject1\venv\Scripts\activate.bat # pip install scikit-le…

webpack项目 index.html 根据不同的变量引入不同的js

项目 webpack搭建 问题&#xff1a;在入口文件index.html中根据不同的变量引入不同的js 使用插件HtmlWebpackPlugin HtmlWebpackPlugin 项目里用来生成静态文件的 这个插件每个项目基本都要用到的&#xff0c;只要全局搜一下位置 根据配置文件的指令找到执行的文件&#xff0…

[点云分割] 区域增长分割

效果&#xff1a; 原始数据 分割结果 代码&#xff1a; #include <iostream> #include <vector> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> // 各种点云数据类型 #include <pcl/search/search.h> #include <pcl/search/kdtr…

【Java】基于SaaS模式的Java基层医院卫生健康云HIS系统源码

一、模板管理 模板分为两种&#xff1a;病历模板和报表模板。模板管理是运营管理的核心组成部分&#xff0c;是基层卫生健康云中各医疗机构定制电子病历和报表的地方&#xff0c;各医疗机构可根据自身特点特色定制电子病历和报表&#xff0c;制作的电子病历及报表可直接在业务…

CSS画一条线

<p style"border: 1px solid rgba(0, 0, 0, 0.1);"></p> 效果&#xff1a;

Power Apps-Timer

插入一个计时器 右侧属性面板&#xff0c;持续时间的单位是毫秒&#xff0c;60000就是60秒&#xff08;一分钟&#xff09;&#xff1b;开启重复是指60秒结束后重新开始计时&#xff1b;自动启动是指当从其他页面进入时是否自动开始计时&#xff1b;自动暂停是指当离开这个页面…

Python语言:猜数字游戏案例讲解

猜数字游戏题目要求如下&#xff1a;该程序随机生成一个1到100之间的整数&#xff0c;然后要求玩家在有限的次数内猜出这个数字。如果玩家猜对了&#xff0c;游戏结束并显示成功信息&#xff1b;如果玩家猜错了&#xff0c;程序会提示玩家猜的数字是偏大还是偏小&#xff0c;并…

VsCode连接远程Linux编译环境的便捷处理

1.免输登录密码 免输命令的正确方法是使用公钥和私鈅在研发设备&#xff0c;和linux服务器上校验身份。公钥和私钥可在windows系统上生成。公钥要发送到linux服务器。私钥需要通知给本地的ssh客户端程序&#xff0c;相关的操作如下&#xff1a; 生成 SSH Key&#xff1a; 打开…

如何编辑WordPress配置文件wp-config.php

目录 wp-config.php文件全部内容&#xff1a; 修改wp-config.ph文件中的数据库设置&#xff1a; 设置wp-config.ph文件中的密钥部分 修改数据库表前缀 设置绝对路径 WordPress会把数据库的相关信息存在wp-config.php文件中。如果编辑有问题&#xff0c;则会出现建立数据库连…

C语言--每日五道选择题-- Day22

第一题&#xff08;注意&#xff09; 1.下列 C 代码中&#xff0c;不属于未定义行为的有&#xff1a;______。 A&#xff1a;int i0; i(i); B&#xff1a;char *p"hello"; p[1]E; C&#xff1a;char *p"hello"; char ch*p; D&#xff1a;int i0; printf(&q…

Leo赠书活动-10期 【AIGC重塑教育 AI大模型驱动的教育变革与实践】文末送书

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

【SpringBoot】ThreadLocal 的详解

一、ThreadLocal 简介 ThreadLocal 叫做线程变量&#xff0c;意思是 ThreadLocal 中填充的变量属于当前线程&#xff0c;该变量对其他线程而言是隔离的&#xff0c;也就是说该变量是当前线程独有的变量。ThreadLocal 为变量在每个线程中都创建了一个副本&#xff0c;那么每个线…

Redis 性能管理 主从复制与哨兵模式

目录 redis性能管理 内存碎片率 如何清理内存 面试题 Redis雪崩 Redis集群大面积故障 面试&#xff1a;Redis的缓存击穿 Redis的缓存穿透 Redis的集群高可用方案 redis的主从复制 哨兵模式 redis性能管理 redis的数据缓存在内存当中 info memory #在redis数据库中查…

npm ERR!问题解决

问题一 解决办法 两个文件夹【node_global】和【node_cache】 修改文件属性 问题二 解决办法 安装淘宝镜像 npm config set registry https://registry.npm.taobao.org 查看是否成功&#xff1a; npm config get registry 是淘宝的就ok

口袋参谋:只用一招,提前规避差评!请看具体操作步骤

​如何提前规避差评&#xff1f;至少99%的商家都不知道该怎么做&#xff0c;剩下的1%还是我刚教会的。 宝贝的评价直接影响宝贝转化&#xff0c;特别是新品链接。 10个好评也挽回不了一个差评对产品的致命打击&#xff0c;差评就像一个重磅炸弹&#xff0c;威力足够能让你的转…

【Java】实现阻塞队列-生产者/消费者模型

上文中我们讲了Java库中自带的阻塞队列&#xff0c;并且讲了如何用阻塞队列来实现生产者消费者模型 【Java】用Java库中自带的阻塞队列以及用阻塞队列实现生产者-消费者模型 下面我们来讲如何用代码实现一个阻塞队列 1、实现一个阻塞队列 阻塞队列 普通队列 线程安全 阻…

基于springboot实现摄影跟拍预定管理系统【项目源码+论文说明】

基于springboot实现摄影跟拍预定管理系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要…

SD3403/SS928 视频采集调试记录

问题1&#xff1a;运行 ./sample_vio 0 报错 问题2&#xff1a;板卡连接摄像模组后无法ping同 错误原因&#xff1a; 摄像头模组连接错误 修改后重新调试 下一步 外接显示屏查看输入输出 ...

产品工程师工作的职责十篇(合集)

一、岗位职责的作用意义 1.可以最大限度地实现劳动用工的科学配置; 2.有效地防止因职务重叠而发生的工作扯皮现象; 3.提高内部竞争活力&#xff0c;更好地发现和使用人才; 4.组织考核的依据; 5.提高工作效率和工作质量; 6.规范操作行为; 7.减少违章行为和违章事故的发生…

FlinkCDC实现主数据与各业务系统数据的一致性(瀚高、TIDB)

文章末尾附有flinkcdc对应瀚高数据库flink-cdc-connector代码下载地址 1、业务需求 目前项目有主数据系统和N个业务系统,为保障“一数一源”,各业务系统表涉及到主数据系统的字段都需用主数据系统表中的字段进行实时覆盖,这里以某个业务系统的一张表举例说明:业务系统表Ta…