Echarts中的水波图、水球图、水半球实现的详细步骤(vue)

目录

一、实现效果

二、实现步骤

1. 安装ECharts和Liquid Fill插件

2. 创建一个组件

3.在创建的vue中引入ECharts和Liquid Fill插件

 4.在组件中初始化ECharts和Liquid Fill插件

 5.完整代码


一、实现效果

        Echarts中的水位图(水波图、水球图、水半球)实现的详细步骤,先看实现效果:

二、实现步骤

1. 安装ECharts和Liquid Fill插件

使用npm安装ECharts和Liquid Fill插件。

npm install echarts echarts-liquidfill
2. 创建一个组件

 创建组件便于后续的复用

3.在创建的vue中引入ECharts和Liquid Fill插件
import echarts from 'echarts';import 'echarts-liquidfill';
 4.在组件中初始化ECharts和Liquid Fill插件
<script>
import * as echarts from 'echarts';
import 'echarts-liquidfill'; // 引入液体填充插件export default {name: 'WaterBallChart',mounted() {this.initChart();},methods: {initChart() {const myChart = echarts.init(this.$refs.chart);// 配置项const option = {series: [{type: 'liquidFill',//设置图表类型data: [0.6], // 设置水位,值为0到1之间radius: '80%', // 设置图的大小outline: {borderDistance: 4, // 外边框距离itemStyle: {borderWidth: 2, // 外边框宽度borderColor: '#156ACF' // 外边框颜色}},backgroundStyle: {color: '#E3F7FF' // 背景色},label: {normal: {textStyle: {color: '#156ACF',//标签文本颜色insideColor: '#fff',fontSize: 40}}}}]};// 使用配置项设置图表myChart.setOption(option);}}
};
</script>
 5.完整代码
<template><div ref="pieChartRef" class="chart-container"></div>
</template><script lang="ts" setup>
import { useDebounceFn } from '@vueuse/core'
import * as echarts from 'echarts'
import 'echarts-liquidfill'
import { onMounted, ref, watch, computed, onBeforeUnmount } from 'vue'
const props = defineProps({progress: {type: Number,default: 0,validator: (value: number) => {return Number(value.toFixed(2)) === value}}
})
const chartInstance = ref<echarts.ECharts | null>(null)
const pieChartRef = ref<HTMLElement | null>(null)
const isMounted = ref(false)
const simulatedSeconds = ref(0)
let timer: number | null = null // 定时器// 格式化时间
const formatTime = (seconds: number): string => {const days = Math.floor(seconds / 86400)const hours = Math.floor((seconds % 86400) / 3600)const minutes = Math.floor((seconds % 3600) / 60)const secs = seconds % 60const parts = []if (days > 0) parts.push(`${days}d`)if (hours > 0) parts.push(`${hours}h`)if (minutes > 0) parts.push(`${minutes}m`)parts.push(`${secs}s`)return parts.join(' ')
}
const clearTimer = () => {if (timer) {clearInterval(timer)timer = null}
}const startTimer = () => {if (!timer && isMounted.value) {timer = setInterval(() => {if (props.progress < 100) {simulatedSeconds.value += 1updateChart()}}, 1000) as any}
}
const safeUpdateChart = () => {if (!isMounted.value || !pieChartRef.value || !chartInstance.value) returnsimulatedSeconds.value += 0updateChart()
}
const initChart = () => {if (pieChartRef.value) {chartInstance.value = echarts.init(pieChartRef.value)updateChart()}
}
const updateChart = () => {if (!chartInstance.value) returnconst showProgress = props.progress >= 100 ? 1 : props.progress / 100const showWave = props.progress >= 100 ? 0.98 : showProgressconst showStatus = props.progress >= 100 ? '分析完成' : 'AI识别中...'const waterGradient = new echarts.graphic.LinearGradient(0, 0, 0, 1,[{ offset: 0, color: 'rgba(42, 139, 250, 1)' },{ offset: 1, color: 'rgba(42, 139, 250, 0)' }])const option = {series: [{type: 'liquidFill',data: [{value: showWave,direction: 'left',itemStyle: {color: waterGradient,opacity: 0.8},emphasis: {itemStyle: {color: waterGradient,opacity: 1}},amplitude: 15,waveLength: '80%',phase: 'auto',period: (_: any, i: number) => 2000 + i * 500,itemCount: 3}],waveAnimation: true,radius: '80%',outline: {show: true,borderDistance: -10,itemStyle: {borderWidth: 2,borderColor: '#4EC9F2FF'}},backgroundStyle: {color: '#123059CC'},label: {normal: {formatter: `{percent|${props.progress}%}\n{a|${showStatus}}\n{b|${formatTime(simulatedSeconds.value)}}`,rich: {percent: {fontSize: 56,color: '#00FFFFFF',lineHeight: 60},a: {fontSize: 12,color: '#00FFFFFF',lineHeight: 30},b: {fontSize: 16,color: 'rgba(0, 164, 255, 1)',fontWeight: '700',lineHeight: 30}}}}}]}chartInstance.value.setOption(option, true)
}
const resizeHandler = useDebounceFn(() => {chartInstance.value?.resize()
}, 300)watch(() => props.progress, (newVal) => {if (newVal >= 100) {clearTimer()updateChart()}
})onMounted(() => {console.log('水球组件挂载了')isMounted.value = trueinitChart()startTimer()window.addEventListener('resize', resizeHandler)
})onBeforeUnmount(() => {console.log('水球组件被卸载了')isMounted.value = falsewindow.removeEventListener('resize', resizeHandler)clearTimer()chartInstance.value?.dispose()
})
</script><style lang="scss" scoped>
.chart-container {width: 300px;height: 360px;background: url('@/assets/images/svg/analysis-echarts-bg.svg') no-repeat center center;background-size: contain;position: relative;.completion-marker {position: absolute;top: 54%;left: 39%;transform: translate(-50%, -50%);font-size: 18px;color: #24BD61;text-shadow: 0 0 20px rgba(36, 189, 97, 0.5);z-index: 2;}// 覆盖水球层叠顺序canvas {position: relative;z-index: 1;}
}
</style>

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

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

相关文章

Vue父组件向子组件传递一个动态的值,子组件如何保持实时更新实时更新?

父组件 通过 :issueDeptId this.form109.issueDeptId传数据到子组件 <inv-info ehco-data"selectOutInvId" :purposeId this.form109.purposeId:issueDeptId this.form109.issueDeptId:projectNo this.form109.projectNo:invPhysicIds this.form109.issuePh…

如何通过主数据治理重构企业系统竞争力

在当前企业数字化转型持续深化的背景下&#xff0c;IT系统复杂度与数据规模呈指数级增长。CRM、ERP、HRM、供应链、电商平台等多系统并行运作已成为常态。然而&#xff0c;随之而来的主数据&#xff08;Master Data&#xff09;管理难题&#xff0c;正日益成为制约系统稳定性、…

c++ 中 原子锁、互斥锁、自旋锁的区别和详细用法

用最生活化的比喻来解释 C 中原子锁、互斥锁和自旋锁的区别和用法&#xff0c;让小白也能秒懂&#xff01;&#x1f604;想象你 ​​&#xff08;线程&#xff09;​​ 要去公共更衣室 ​​&#xff08;共享资源&#xff0c;如变量、数据结构&#xff09;​​ 换衣服。这个更衣…

RabbitMQ面试精讲 Day 12:镜像队列与Quorum队列对比

【RabbitMQ面试精讲 Day 12】镜像队列与Quorum队列对比 开篇&#xff1a;面试价值与核心要点 在RabbitMQ集群环境中&#xff0c;如何保证消息的高可用性是最常被问及的面试问题之一。今天我们将深入探讨RabbitMQ提供的两种高可用队列实现方案&#xff1a;经典镜像队列(Mirror…

Maven 常用命令详解

前言 Apache Maven 是 Java 项目管理和构建自动化工具&#xff0c;它通过一个项目对象模型&#xff08;POM, Project Object Model&#xff09;来管理项目的构建、报告和文档。Maven 的核心优势在于其强大的依赖管理、标准化的项目结构以及丰富的插件生态系统。掌握 Maven 的常…

Android Studio切换到经典UI,老UI

为什么要写这边文章&#xff0c;我自己的android studio年儿半载安装一次新的&#xff0c;所以记录一下。1、新android studio安装后都是新工作室风格的UI。2、菜单File ->Settings ,在Setting界面将Enable New UI 的勾选去掉&#xff0c;点击OK&#xff0c;重启Android Stu…

走进“Mesh无线自组网”:开启智能家居和智慧工厂

随着科技的迅猛发展&#xff0c;互联网已经渗透到我们生活的方方面面&#xff0c;而其中最引人瞩目的便是“智能家居”和“智慧工厂”。这些新兴领域的飞速发展&#xff0c;离不开底层网络技术的支持。众多的网络通信技术中&#xff0c;Mesh无线自组网以其独特的优势&#xff0…

力扣热题100——双指针

双指针两数之和&#xff08;有序数组&#xff0c;相向双指针&#xff09;问题&#xff1a;在有序数组中找到两个数&#xff0c;使它们的和等于目标值。思路&#xff1a;左指针从起点出发&#xff0c;右指针从终点出发&#xff0c;根据和与目标值的大小调整指针。 #include <…

AI Infra与LLM的联系与差异

一、定义与定位LLM&#xff08;大语言模型&#xff09; 定义&#xff1a;基于海量文本训练的深度学习模型&#xff0c;通过Transformer架构实现语言理解与生成&#xff0c;典型代表如GPT-4、通义千问等。定位&#xff1a;AI应用的核心能力层&#xff0c;直接面向用户提供文本生…

数据结构-双链表

学习完单链表&#xff0c;现在继续学习双链表一、双链表结构带头双向循环链表&#xff08;简称&#xff1a;双链表&#xff09;注意&#xff1a;这⾥的“带头”跟前面我们说的“头节点”是两个概念&#xff0c;实际前面的在单链表阶段称呼不严谨&#xff0c;但是为了同学们更好…

福彩双色球第2025090期篮球号码分析

明天是星期四&#xff0c;明天晚上双色球开奖。福彩双色球第2025090期篮球号码分析&#xff0c;上期开出号码05&#xff0c;数字形式是质数奇数2路球&#xff0c;小号0字头数字。本期篮球号码分析&#xff0c;篮球2尾数0212遗漏6期上次遗漏27期&#xff0c;篮球3尾数0313遗漏4期…

Python爬虫实战:研究Photon工具,构建企业信息收集系统

1. 引言 1.1 研究背景 在数字化时代,互联网作为全球最大的信息载体,涵盖商业情报、学术资源、公共信息等多个领域,对企业决策、学术研究和社会治理具有重要参考价值。传统信息获取方式依赖人工检索和简单脚本爬取,存在效率低下、覆盖范围有限、数据处理能力不足等问题。 …

Python Pandas.lreshape函数解析与实战教程

Python Pandas.lreshape 函数解析与实战教程 摘要 本教程旨在提供一份关于Pandas库中 pandas.lreshape 函数的全面使用教程和分析。lreshape 是一个用于数据重塑(Data Reshaping)的工具,具体而言,它擅长将“宽格式”(Wide Format)数据转换为“长格式”(Long Format)数…

vue3 el-dialog自定义实现拖拽、限制视口范围增加了拖拽位置持久化的功能

采用element-plus的拖拽功能代码,在此基础上增加了记忆拖拽上次拖拽位置的功能,开袋即食; 前提:每次关闭弹窗都要销毁; 解决了默认设置transform的偏移量后首次拖拽弹窗偏移量错误的问题修改。<template><el-dialogref="popupRefDialog":title="…

学习嵌入式之硬件——ARM体系

一、ARM内核基础知识1.ALU&#xff1a;算术逻辑单元&#xff1b;完成运算的电路2.通用寄存器&#xff1a;R0~R15R13&#xff08;SP&#xff09;&#xff1a;栈指针寄存器&#xff1a;指向栈顶的位置&#xff1b;并在函数调用、中断处理等场景中自动更新。R14&#xff08;LR&…

微信小程序中使用TensorFlowJS从环境搭建到模型训练及推理模型得到预测结果

1、小程序端环境准备app.json"plugins": {"tfjsPlugin": {"version": "0.2.0","provider": "wx6afed118d9e81df9"}}package.json"dependencies": {"tensorflow-models/posenet": "^2.2.…

深入剖析通用目标跟踪:一项综述

摘要 通用目标跟踪仍是计算机视觉领域一项重要且具有挑战性的任务,其难点在于复杂的时空动态变化,尤其在存在遮挡、相似干扰物和外观变化的情况下。过去二十年间,为应对这些挑战,研究者提出了多种跟踪范式,包括基于孪生网络的跟踪器、判别式跟踪器以及近期突出的基于Tran…

Next.js 链接与导航:页面间无缝切换

链接与导航&#xff1a;页面间无缝切换 关键要点 Next.js 提供了 <Link> 组件和程序化导航方法&#xff0c;实现页面间高效、无缝的切换。<Link> 组件利用客户端导航和预加载技术&#xff0c;优化用户体验和性能。程序化导航通过 useRouter 钩子&#xff08;Page…

根据经纬度(从nc格式环境数据文件中)提取环境因子

根据经纬度&#xff08;从nc格式环境数据文件中&#xff09;提取环境因子 文章目录前言一、准备所需文件二、代码分享总结前言 本文主要利用nc格式环境数据文件和物种经纬度分布文件&#xff0c;根据经纬度&#xff08;从nc格式环境数据文件中&#xff09;提取环境因子 一、准…

Uniapp 自定义 Tabbar 实现教程

Uniapp 自定义 Tabbar 实现教程1. 简介2. 实现步骤2.1 创建自定义 Tabbar 组件2.2 配置 pages.json3.1 路由映射3.2 样式设计3.3 图标处理4. 常见问题及解决方案4.1 页面跳转问题4.2 样式适配问题4.3 性能优化5. 扩展功能5.1 添加徽标5.2 添加动画效果6. 总结1. 简介 在 Uniap…