echarts 实现水利计算模型-雨量,流量,时间分割线

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

需求背景

实现水利计算模型-雨量,流量,时间分割线

解决效果

在这里插入图片描述

ISQQW代码地址

链接

index.vue

<!--/**
* @author: liuk
* @date: 2024/06/13
* @describe: 洪水预报结果图表
*/-->
<template>
  <div ref="chatDom" class="sectionalResultChart"></div>
</template>

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

import {formatToFixed} from "@/utils/dictionary"
// Props
const props = defineProps(['data'])

import {usefloodForecastStore} from "@/store/modules/floodForecast";

const floodForecastStore = usefloodForecastStore()

let myChart = null // Vue3 使用 proxy 对象代理,而 echarts 则使用了大量的全等(===), 对比失败从而导致了bug。
const chatDom = ref(null)
const isWrank = ref(false) // 最大值是否超出1w

watch(() => props.data, (data) => {
  const temp = data.map(item => {
    const {historyFlow, hdlflow, ddrmflow, xajflow, siflow, lstmflow} = item
    return Object.values({historyFlow, hdlflow, ddrmflow, xajflow, siflow, lstmflow})
  }).flat()
  const maxValue = Math.max.apply(null, temp)
  isWrank.value = maxValue >= 1e4

  nextTick(() => {
    drawChart()
    myChart.showLoading({
      text: '加载中...',  // 加载提示文本
      color: '#fff',   // 加载动画颜色
      textColor: '#fff',  // 文字颜色
      maskColor: 'rgba(41, 12, 12, .5)',  // 遮罩颜色
      zlevel: 0           // z轴层级
    })
    if (data.length) {
      myChart.hideLoading();
      const option = myChart.getOption()
      myChart.clear()
      myChart.setOption(renderFn(option, data))
    }
  })
}, {immediate: true})

const renderFn = (option, data) => {
  const curForecastTime = floodForecastStore.curSelectObj.forecastTime || ''
  const len = data.length // 数据总长度
  let curDivisionHourNum = Math.max(data.findIndex(item => moment(item.time).valueOf() === moment(curForecastTime).valueOf()), 0) // 分割线位置
  debugger
  option.legend[0].data = ['面雨量', '实测流量', '混合深度学习', 'DDRM', '新安江', '时空异构', 'LSTM']
  option.xAxis[0].data = data.map(item => item.time)
  option.yAxis[0].name = isWrank.value ? '流量 万m³/s' : '流量 m³/s'
  option.yAxis[1].max = Math.max.apply(null,data.map(item => formatToFixed(item.rainfallValue) || 0)) * 3
  option.series[0].data = data.map(item => formatToFixed(item.rainfallValue) || 0)//面雨量
  option.series[1].data = data.map(item => formatToFixed(item.historyFlow) || 0)//实测流量
  option.series[2].data = data.slice(0, curDivisionHourNum).fill('-').concat(data.slice(curDivisionHourNum).map(item => formatToFixed(item.hdlflow) || 0))//混合深度学习
  option.series[3].data = data.slice(0, curDivisionHourNum).fill('-').concat(data.slice(curDivisionHourNum).map(item => formatToFixed(item.ddrmflow) || 0))//DDRM
  option.series[4].data = data.slice(0, curDivisionHourNum).fill('-').concat(data.slice(curDivisionHourNum).map(item => formatToFixed(item.xajflow) || 0))//新安江
  option.series[5].data = data.slice(0, curDivisionHourNum).fill('-').concat(data.slice(curDivisionHourNum).map(item => formatToFixed(item.siflow) || 0))//时空异构
  option.series[6].data = data.slice(0, curDivisionHourNum).fill('-').concat(data.slice(curDivisionHourNum).map(item => formatToFixed(item.lstmflow) || 0))//LSTM
  // ------- 虚线
  option.series[7].data = data.slice(0, curDivisionHourNum + 1).map(item => formatToFixed(item.hdlflow) || 0)//混合深度学习
  option.series[8].data = data.slice(0, curDivisionHourNum + 1).map(item => formatToFixed(item.ddrmflow) || 0)//DDRM
  option.series[9].data = data.slice(0, curDivisionHourNum + 1).map(item => formatToFixed(item.xajflow) || 0)//新安江
  option.series[10].data = data.slice(0, curDivisionHourNum + 1).map(item => formatToFixed(item.siflow) || 0)//时空异构
  option.series[11].data = data.slice(0, curDivisionHourNum + 1).map(item => formatToFixed(item.lstmflow) || 0)//LSTM
  // ----- 定位分割线
  option.series[12].data = new Array(len).fill(0.1)
  option.series[12].data[curDivisionHourNum] = 0
  const curHeight = parseInt(window.getComputedStyle(chatDom.value).height)
  switch (true) {
    case curHeight >= 600:
      option.series[12].markPoint.symbolSize = [1.5, 515]
      option.series[12].markPoint.symbolOffset = [0, -257]
      break
    case curHeight > 460:
      option.series[12].markPoint.symbolSize = [1.5, 385]
      option.series[12].markPoint.symbolOffset = [0, -192]
      break
    default:
      option.series[12].markPoint.symbolSize = [1.5, 200]
      option.series[12].markPoint.symbolOffset = [0, -100]
  }

  return option
}

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

const drawChart = () => {
  let chartDom = chatDom.value
  if (chartDom == null) {
    return
  }
  echarts.dispose(chartDom)
  myChart = echarts.init(chartDom)
  const option = {
        color: ['rgba(46, 165, 255, 1)', 'rgba(0, 0, 255, 1)', 'rgba(0, 207, 19, 1)', 'rgba(254, 254, 62, 1)', 'rgba(244, 106, 87, 1)', 'rgba(255, 162, 0, 1)', 'rgba(247, 0, 237, 1)'],
        tooltip: {
          trigger: 'axis',
          padding: [0, 10, 10, 10],
          axisPointer: {
            type: 'shadow',
            label: {
              show: true,
            },
          },
          formatter: function (param) {
            let data = param.filter(item => item.data !== '-' && item.seriesName !== "定位分割线")
            data = data.filter((item, i) => data.findIndex(x => x.seriesName === item.seriesName) === i)
            return `
          <div class="sectionalResultChart-popup">
            <p class="top">
                <span>${param[0]?.axisValue} </span>
            </p>
            ${
                data.map(item => {
                  let unit
                  switch (true) {
                    case ['面雨量'].includes(item.seriesName):
                      unit = 'mm';
                      break
                    default:
                      unit = 'm³/s'
                      break
                  }
                  return `
                  <p class="item">
                      <i class="icon" style="background-color:${item.color}"></i>
                      <span class="name">${item.seriesName}</span>
                      <span class="value"><b>${item.data || 0}</b>${item.data !== '--' ? unit : ''}</span>
                  </p>`
                }).join("")
            }
          </div>
        `
          }
        },
        dataZoom: [
          {
            type: 'inside'
          }
        ],
        grid: {
          left: 45,
          top: 40,
          right: 40,
          bottom: 40,
          splitLine: {
            show: true,
            lineStyle: {
              color: 'rgba(0, 0, 0, 0.1)',
              type: 'dashed'
            }
          }
        },
        legend: {
          data: [],
          top: 5,
          icon: 'circle',
          textStyle: {
            color: '#fff'
          },
        },
        xAxis: {
          type: 'category',
          data: ['2021/06/25', '2021/06/25', '2021/06/25', '2021/06/25', '2021/06/25', '2021/06/25', '2021/06/25',],
          alignTicks: true,
          axisLine: {
            lineStyle: {
              color: '#ccc'
            }
          },
          splitLine: {
            show: false,
            lineStyle: {
              width: 1,
              color: '#eee',
            },
          },
          axisTick: {
            alignWithLabel: true,
          },
          axisLabel: {
            margin: 10,
            textStyle: {
              color: '#eee',
              fontSize: 14,
            },
            formatter: (val) => moment(val).format('HH:mm')
          },
        },
        yAxis: [
          {
            type: 'value',
            name: '流量 m³/s',
            axisTick: {
              show: false,
            },
            axisLine: {
              show: false,
            },
            nameTextStyle: {
              color: '#fff'
            },
            splitLine: {
              show: false
            },
            axisLabel: {
              color: '#fff',
              formatter: (val) => isWrank.value ? formatToFixed(val / 1e4, 1) : val
            },
          },
          {
            type: 'value',
            name: '面雨量 mm',
            nameLocation: 'start',
            inverse: true,
            nameTextStyle: {
              color: '#fff'
            },
            splitLine: {
              show: false
            },
            axisLabel: {
              color: '#fff',

            },
          }
        ],
        series: [
          {
            name: '面雨量',
            type: 'bar',
            data: [],
            yAxisIndex: 1,
            itemStyle: {
              borderRadius: [0, 0, 5, 5]
            },
          },
          {
            name: '实测流量',
            smooth: true,
            type: 'line',
            showSymbol: false,
            barWidth: '30%',
            data: [],
            yAxisIndex: 0,
          },
          {
            name: '混合深度学习',
            type: 'line',
            smooth: true,
            showSymbol: false,
            barWidth: '30%',
            data: [],
            yAxisIndex: 0,
          },
          {
            name: 'DDRM',
            type: 'line',
            smooth: true,
            showSymbol: false,
            barWidth: '30%',
            data: [],
            yAxisIndex: 0,
          },
          {
            name: '新安江',
            type: 'line',
            smooth: true,
            showSymbol: false,
            barWidth: '30%',
            data: [],
            yAxisIndex: 0,
          },
          {
            name: '时空异构',
            type: 'line',
            smooth: true,
            showSymbol: false,
            barWidth: '30%',
            data: [],
            yAxisIndex: 0,
          },
          {
            name: 'LSTM',
            type: 'line',
            smooth: true,
            showSymbol: false,
            barWidth: '30%',
            data: [],
            yAxisIndex: 0,
          },
          // 虚线 -------------
          {
            name: '混合深度学习',
            type: 'line',
            smooth: true,
            showSymbol: false,
            barWidth: '30%',
            data: [],
            lineStyle: {
              type: 'dashed'
            },
            yAxisIndex: 0,
          },
          {
            name: 'DDRM',
            type: 'line',
            smooth: true,
            showSymbol: false,
            barWidth: '30%',
            data: [],
            lineStyle: {
              type: 'dashed'
            },
            yAxisIndex: 0,
          },
          {
            name: '新安江',
            type: 'line',
            smooth: true,
            showSymbol: false,
            barWidth: '30%',
            data: [],
            lineStyle: {
              type: 'dashed'
            },
            yAxisIndex: 0,
          },
          {
            name: '时空异构',
            type: 'line',
            smooth: true,
            showSymbol: false,
            barWidth: '30%',
            data: [],
            lineStyle: {
              type: 'dashed'
            },
            yAxisIndex: 0,
          },
          {
            name: 'LSTM',
            type: 'line',
            smooth: true,
            showSymbol: false,
            barWidth: '30%',
            data: [],
            lineStyle: {
              type: 'dashed'
            },
            yAxisIndex: 0,
            markLine: {
              silent: true,
              lineStyle: {
                type: 'solid',
                color: 'red',
              },
              data: 2
            },
          },
          //定位分割线 ---------------
          {
            name: '定位分割线',
            smooth: true,
            type: 'line',
            showSymbol: false,
            barWidth: '30%',
            color: 'transparent',
            data: ['0.1', '0.1', 0.1, 0.1, 0.1, 0.1, 0.1, 0, 0.1],
            yAxisIndex: 0,
            markPoint: {
              symbol: 'rect',
              symbolSize: [1.5, 600],
              symbolOffset: [0, -215],
              data: [
                {
                  type: 'min',
                  itemStyle: {
                    color: 'red'
                  },
                  label: {
                    show: true,
                    color: 'red',
                    position: 'top',
                    formatter: '预报作业时间',
                    fontSize: 12,
                  },
                  emphasis: {
                    disabled: true
                  }
                },
              ],
            },
          },
        ],
      };
  option && myChart.setOption(option)
}

</script>

<style lang="scss" scoped>
.sectionalResultChart {
  width: 100%;
  height: 100%;
  max-height: 600px;
}
</style>

<style lang="scss">
.sectionalResultChart-popup {
  overflow: hidden;
  //margin: 3px 10px;

  .top {
    //margin-bottom: 16px;
    font-weight: bold;
  }

  .item {
    display: flex;
    align-items: center;
    margin: 10px 0;

    &:last-child {
      margin-bottom: 0;
    }

    .icon {
      display: inline-block;
      width: 12px;
      height: 12px;
      margin-right: 10px;
      border-radius: 50%;
    }

    .name {
      width: 90px;
      margin-right: 10px;
    }

    .value {
      flex: 1;
      text-align: right;
    }
  }
}
</style>

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

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

相关文章

MySQl高级篇-事务、锁机制、MVCC

存储引擎的选择 在选择存储引擎时&#xff0c;应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统&#xff0c;还可以根据实际情况选择多种存储引擎进行组合。 InnoDB&#xff1a;是Mysql的默认存储引擎&#xff0c;支持事务、外键。如果应用对事务的完整性有比较…

MMLab-dataset_analysis

数据分析工具 这里写目录标题 数据分析工具dataset_analysis.py数据可视化分析 benchmark.pybrowse_coco_json.pybrowse_dataset.pyOptimize_anchors mmyolo、mmsegmentation等提供了数据集分析工具 dataset_analysis.py 数据采用coco格式数据 根据配置文件分析全部数据类型或…

【开源】开源数据库工具推荐

Mysql开源工具推荐 dbeaver下载网速太慢了&#xff0c;这么好用的开源工具&#xff0c;可以从镜像站中下载&#xff1a; 下载地址&#xff1a; https://mirrors.nju.edu.cn/github-release/dbeaver/dbeaver/24.1.1/ Redis开源工具推荐 好看好用&#xff0c;UI真是做的很不…

PE文件(九)导出表

引入导出表 Win32下的一个PE文件&#xff0c;是由多个PE文件组成。比如通过OD打开一个Ipmsg.exe&#xff0c;查看模块M&#xff0c;会发现模块有一个ipmsg.exe文件和多个动态链接库.dll文件。 当一个exe文件通过使用动态链接库.dll的方式导出某.dll文件某函数进行使用时&#…

Qt+ESP32+SQLite 智能大棚

环境简介 硬件环境 ESP32、光照传感器、温湿度传感器、继电器、蜂鸣器 基本工作流程 上位机先运行&#xff0c;下位机启动后尝试连接上位机连接成功后定时上报传感器数据到上位机&#xff0c;上位机将信息进行处理展示判断下位机传感器数据&#xff0c;如果超过设置的阈值&a…

Puppeteer动态代理实战:提升数据抓取效率

引言 Puppeteer是由Google Chrome团队开发的一个Node.js库&#xff0c;用于控制Chrome或Chromium浏览器。它提供了高级API&#xff0c;可以进行网页自动化操作&#xff0c;包括导航、屏幕截图、生成PDF、捕获网络活动等。在本文中&#xff0c;我们将重点介绍如何使用Puppeteer…

项目部署笔记

1、安全组需开放&#xff08;如果不开放配置nginx也访问不到&#xff09; 2、域名解析配置IP(子域名也需配置IP&#xff0c;IP地址可以不同) 3、如果出现图片获其他的文件找不到的情况请仔细检查一下路径是否正确 4、服务器nginx配置SSL证书后启动报错&#xff1a; nginx: […

嘉立创EDA隐藏地线或者

https://prodocs.lceda.cn/cn/pcb/side-panel-left-net/#%E9%A3%9E%E7%BA%BF

Ceph集群部署(基于ceph-deploy)

目录 部署Ceph集群的方法 Ceph生产环境推荐 部署Ceph实验&#xff08;基于ceph-deploy&#xff09; 一、准备工作 二、环境准备 1.关闭selinux与防火墙 2.修改主机名并且配置hosts解析映射 3.admin管理节点配置ssh免密登录node节点 4.安装常用软件和依赖包 5.配置时间…

807.力扣每日一题7/14 Java(执行用时分布击败100%)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 解题思路 解题过程 时间复杂度 空间复杂度 Code 解题思路 首先…

C语言--递归

曾经有一个段子&#xff1a;上大学时&#xff0c;我们的c语言老师说&#xff1a;学c时&#xff0c;如果有50%的同学死在了循环上面&#xff0c;那么就有90%的同学死在了递归上面。接下来&#xff0c;就来看看递归是怎么个事&#xff1f; 一.递归的介绍 递归是指一个函数直接或…

护佑未来!引领儿童安全新时代的AI大模型

引领儿童安全新时代的AI大模型 一. 前言1.1 AI在儿童安全方面的潜在作用1.2 实时监控与预警1.3 个性化安全教育与引导1.4 家长监护与安全意识提升 二. AI大模型的优势2.1. 保护儿童隐私和安全的重要性2.2. AI大模型如何应用于儿童安全领域2.1 儿童内容过滤2.2.1 儿童行为监测 2…

算法力扣刷题记录 四十四【222.完全二叉树的节点个数】

前言 二叉树篇继续。 记录 四十四【222.完全二叉树的节点个数】 一、题目阅读 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都…

Java时间复杂度介绍以及枚举

时间复杂度 从小到大&#xff1a; O(1) 常数阶。复杂度为O(1)与问题规模无关 线性阶 O&#xff08;n&#xff09;比如一个for循环中代码执行n遍 n阶 对数阶 int n9; int i1; while(i<n) { i*2; } 2^x>n时候退出。次数xlog2^n 时间复杂度为O(logN) 根号阶 int…

09 函数基础

目录 一、定义一个函数 二、调用函数 三、函数的参数 1.形参和实参 2. 参数的分类 3.参数默认值 4.参数类型说明 5.不定长参数 四、函数的返回值 1.定义 2.关键字return 五、变量的作用域 六、匿名函数 七、实参高阶函数 1.定义 2.常见实参高阶函数 max、min、so…

数据结构回顾(Java)

1.数组 线性表 定义的方式 int[] anew int[10] 为什么查询快&#xff1f; 1.可以借助O(1)时间复杂度访问某一元素&#xff0c; 2.地址连续&#xff0c;逻辑连续 3.数组长度一旦确定就不可以被修改 当需要扩容的时候需要将老数组的内容复制过来 在Java中数组是一个对象 Ar…

SpringBoot开发的AI导航站技术架构剖析 —— 技术如何选型 - 第520篇

历史文章&#xff08;文章累计520&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《…

C#与PLC通信——如何设置电脑IP地址

前言&#xff1a; 我们与PLC通过以太网通信时&#xff0c;首先要做的就是先设置好电脑的IP&#xff0c;这样才能实现上位机电脑与PLC之间的通信&#xff0c;并且电脑的ip地址和PLC的Ip地址要同处于一个网段&#xff0c;比如电脑的Ip地址为192.168.1.1&#xff0c;那么PLC的Ip地…

【Android面试八股文】请描述一下 android 的系统架构?

Android 是一个基于 Linux 的开源软件堆栈,针对多种不同设备类型打造。下图显示了 Android 平台的主要组件。 早期的Android架构如下图所示 官方网站最新的Android平台架构图,如下所示: Linux 内核 Android 平台的基础是 Linux 内核。例如,Android 运行时 (ART) 依赖…

css-grid布局(栅格布局)

css新世界-auto-fit grid 一个比flex更强大的布局,适合做整体布局 grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); auto-fit的话有strech效果gap 不仅可以用于grid 也可用flex. 在grid-template-areas表示这个位置空着grid area 的 [a b]命名可重复命名 表示的…