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) // 最大值是否超出1wwatch(() => props.data, (data) => {const temp = data.map(item => {const {historyFlow, hdlflow, ddrmflow, xajflow, siflow, lstmflow} = itemreturn Object.values({historyFlow, hdlflow, ddrmflow, xajflow, siflow, lstmflow})}).flat()const maxValue = Math.max.apply(null, temp)isWrank.value = maxValue >= 1e4nextTick(() => {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) // 分割线位置debuggeroption.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)) * 3option.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))//DDRMoption.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)//DDRMoption.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] = 0const 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]breakcase curHeight > 460:option.series[12].markPoint.symbolSize = [1.5, 385]option.series[12].markPoint.symbolOffset = [0, -192]breakdefault: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.valueif (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 unitswitch (true) {case ['面雨量'].includes(item.seriesName):unit = 'mm';breakdefault: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>

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

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

相关文章

算法篇 滑动窗口 leetcode 长度最小的子数组

长度最小的子数组 1. 题目描述2. 算法图分析2.1 暴力图解2.2 滑动窗口图解 3. 代码演示 1. 题目描述 2. 算法图分析 2.1 暴力图解 2.2 滑动窗口图解 3. 代码演示

数据结构进阶——使用数组实现栈和队列详解与示例(C,C#,C++)

文章目录 1、数组实现栈栈的基本操作C语言实现C#语言实现 2、 数组实现队列队列的基本操作C语言实现C# 语言实现C语言实现 总结 在编程世界中&#xff0c;数据结构是构建高效算法的基石。栈和队列作为两种基本的数据结构&#xff0c;它们的应用非常广泛。本文将带领大家使用C&a…

股票质押约定购回:机制、风险与策略!

​股票质押约定购回&#xff1a;机制、风险与策略 在复杂的金融市场中&#xff0c;股票质押约定购回作为一种常见的融资手段&#xff0c;受到了众多投资者和企业的关注。本文将深入探讨股票质押约定购回的定义、运作机制、潜在风险以及投资者和企业在操作时应采取的策略。 一、…

HackChat匿名聊天室

匿名聊天 聊天室地址 这是一款极简、无干扰的聊天应用程序&#xff0c;可以让你专注于交流而不必担心干扰. 频道通过 url 创建、加入和共享&#xff0c;通过更改问号后的文本来创建自己的频道. hack.chat 服务器上不会保留任何消息历史记录&#xff0c;链接断开消息就会删除. …

尚硅谷大数据技术-数据湖Hudi视频教程-笔记03【Hudi集成Spark】

大数据新风口&#xff1a;Hudi数据湖&#xff08;尚硅谷&Apache Hudi联合出品&#xff09; B站直达&#xff1a;https://www.bilibili.com/video/BV1ue4y1i7na 尚硅谷数据湖Hudi视频教程百度网盘&#xff1a;https://pan.baidu.com/s/1NkPku5Pp-l0gfgoo63hR-Q?pwdyyds阿里…

基于5个K7的多FPGA PCIE总线架构的高性能数据预处理平台

板载FPGA实时处理器&#xff1a;XCKU060-2FFVA15172个QSFP光纤接口&#xff0c;最大支持10Gbps/lane板载DMA控制器&#xff0c;能实现双向DMA高速传输支持x8 PCIE主机接口&#xff0c;系统带宽5GByte/s1个R45自适应千兆以太网口1个FMC子卡扩展接口 基于PCIE总线架构的高性能数据…

DIY系列——自制简易笔记本电脑散热器

前言&#xff1a;为什么要自制笔记本电脑散热器&#xff1f; 夏天到了&#xff0c;电脑的使用频率也在增加。尤其是笔记本电脑&#xff0c;长时间运行后很容易发热&#xff0c;影响性能和寿命。市场上有很多散热器产品&#xff0c;但价格不菲且效果参差不齐。如果你动手能力强…

【原创】springboot+mysql图书共享交流平台设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

C++11空指针类型

C11之前&#xff1a;NULL 在C程序开发中&#xff0c;为了提高程序的健壮性&#xff0c;一般会在定义指针的同时完成初始化操作&#xff0c;或者在指针的指向尚未明确的情况下&#xff0c;都会给指针初始化为NULL&#xff0c;避免产生野指针问题。C98/03 标准中&#xff0c;将一…

gihub配置ssh key

检查本地主机是否已经存在ssh key cd ~/.ssh# 是否存在id_rsa和id_rsa.pub文件&#xff0c;存在则说明已有ssh Key ls生成ssh key ssh-keygen -t rsa -C "Your emailXXX.com"一直回车即可 获取公钥内容&#xff08;id_rsa.pub&#xff09; cd ~/.ssh cat id_rsa…

子数组问题

目录 最大子数组和 环形子数组的最大和 乘积最大子数组 乘数为正数的最长子数组长度 等差数列划分 最长湍流子数组 单词拆分 环绕字符串中唯一的子字符串 声明&#xff1a;接下来主要使用动态规划来解决问题&#xff01;&#xff01;&#xff01; 最大子数组和 题目 …

优化理论——迭代方法

线性回归建模 训练&#xff0c;预测 { ( x ( i ) , y ( i ) ) } \{(x^{(i)},y^{(i)})\} {(x(i),y(i))} ⼀个训练样本&#xff0c; { ( x ( i ) , y ( i ) ) ; i 1 , ⋯ , N } \{(x^{(i)},y^{(i)});i1,\cdots ,N\} {(x(i),y(i));i1,⋯,N} 训练样本集 { ( x 1 ( i ) , x 2 ( i…

Linux 扩展硬盘容量

根分区的硬盘容量不够了需要添加容量 扩展硬盘容量前提是需要虚拟机关机才能进行以下操作 在虚拟中找到虚拟机设置 >> 点击硬盘 >> 选择扩展 >> 输入自已要扩展的大小 >> 确定 这些设置好之后&#xff0c;启动虚拟机 fdisk /dev/sda n p 三个回车…

09、java程序流程控制之一:顺序结构、分支语句(if-else结构)(经典案例以及Scanner类的使用)

java程序流程控制之一&#xff1a; Ⅰ、顺序结构&#xff1a;1、顺序结构简介&#xff1a; Ⅱ、分支语句&#xff1a;if-else1、if-else分支结构&#xff1a;其一、描述&#xff1a;其二、代码为&#xff1a;其三、截图为&#xff1a; 2、如何从键盘获取不同类型的变量&#xf…

Mac Dock栏多屏幕漂移固定的方式

记录一下 我目前的版本是 14.5 多个屏幕&#xff0c;Dock栏切换的方式&#xff1a; 把鼠标移动到屏幕的中间的下方区域&#xff0c;触到边边之后&#xff0c;继续往下移&#xff0c;就能把Dock栏固定到当前屏幕了。

pytorch 是如何调用 cusolver API 的调用

0&#xff0c;环境 ubuntu 22.04 pytorch 2.3.1 x86 RTX 3080 cuda 12.2 1, 示例代码 以potrs为例&#xff1b; hello_cholesk.py """ hello_cholesky.py step1, Cholesky decompose; step2, inverse A; step3, Cholesky again; python3 hello_cholesky.py -…

【Hot100】LeetCode—155. 最小栈

目录 题目1- 思路2- 实现⭐155. 最小栈——题解思路 3- ACM 实现 题目 原题连接&#xff1a;155. 最小栈 1- 思路 思路 最小栈 ——> 借助两个栈来实现 2- 实现 ⭐155. 最小栈——题解思路 class MinStack {Stack<Integer> data;Stack<Integer> min;public …

JVM系列 | 对象的创建与存储

JVM系列 | 对象的生命周期1 对象的创建与存储 文章目录 前言对象的创建过程内存空间的分配方式方式1 | 指针碰撞方式2 | 空闲列表 线程安全问题 | 避免空间冲突的方式方式1 | 同步处理&#xff08;加锁)方式2 | 本地线程分配缓存 对象的内存布局Part1 | 对象头Mark Word类型指针…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 游乐园门票 (200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 最新华为O…

SqlServer SQL语句或存储过程运行慢 使用 WITH RECOMP ILE 或 OPTION (RECOMPILE)(重新编译)

如果您的存储过程包含参数可以重新申明变量把参数接收下&#xff0c;可能解决你过程执行慢的原因。如果未能解决&#xff0c;请参考以下文章内容&#xff1a; WITH RECOMPILE 子句可以在以下地方使用&#xff1a; 一种是当你创建一个过程时&#xff0c;例如&#xff1a; CREA…