Ecahrts竖向柱状图实现自动滚动

news2024/11/28 18:41:27

 效果如下:

1.首先声明一个timer定时器标识

let timer: NodeJS.Timer; // 定时器

2.再声明窗口展示的数量,yAxisIndex2用来记录当前index已经加了多少,方便再formatter中格式化标题的相关信息

const dataZoomEndValue = 6; // 数据窗口范围的结束数值(一次性展示几个)
let yAxisIndex2 = 0; // 表示右侧Y轴从那个刻度开始

3.在option中设置datazoom的相关参数

dataZoom: [
	{
		show: false, // 是否显示滑动条
		yAxisIndex: [0, 1], // // 表示这个 dataZoom 组件控制 第一个 和 二个 yAxis
		startValue: 0, // 数据窗口范围的起始数值
		endValue: dataZoomEndValue // 数据窗口范围的结束数值(一次性展示几个)
	}
],

4.开启一个定时器

getArrByKey(data, "name"):代表的是Y轴标题的数据

getArrByKey(data, "value"):代表的是X轴数量的数据

// 开启定时器自动滚动
if (getArrByKey(data, "name").length > 0 && data.length > 0) {
	timer = setInterval(() => {
		// 每次向后滚动一个,最后一个从头开始
		if (option.dataZoom[0].endValue === getArrByKey(data, "value").length - 1) {
			option.dataZoom[0].startValue = 0; // 数据窗口范围的起始数值
			option.dataZoom[0].endValue = dataZoomEndValue; // 数据窗口范围的结束数值
			yAxisIndex2 = 0;
		} else {
            // 数据窗口范围的起始数值
			option.dataZoom[0].startValue = option.dataZoom[0].startValue + 1; 
            // 数据窗口范围的结束数值
			option.dataZoom[0].endValue = option.dataZoom[0].endValue + 1; 
			yAxisIndex2 += 1;
		}
		myChart.setOption(option);
	}, 2000);
}

5.最后别忘了清除定时器

onUnmounted(() => {
	clearInterval(timer);
});

附上完整代码:

<template>
	<div class="h-220px" style="width: 100%" ref="pieChart"></div>
</template>

<script lang="ts" setup>
import { watch, ref, onMounted, onBeforeUnmount } from "vue";
import * as echarts from "echarts";
import { useEcharts } from "@/hooks/useEcharts";
const pieChart = ref();
const props = defineProps({
	data: {
		type: Object,
		default: () => {}
	}
});
watch(
	() => props.data,
	() => {
		initPieChart();
	},
	{
		deep: true
	}
);
let timer: NodeJS.Timer; // 定时器
const initPieChart = () => {
	// 清除定时器的影响
	if (timer) {
		clearInterval(timer);
	}
	// 判断当前echarts是否存在
	let myChart = echarts.getInstanceByDom(pieChart.value);
	if (myChart == null) {
		myChart = echarts.init(pieChart.value);
	}
	let max = Number(props.data[0]?.stopTime ?? 0); // 假设最大值为数组的第一个元素
	for (let i = 1; i < props.data.length; i++) {
		if (Number(props.data[i].stopTime) > max) {
			// 如果当前元素比最大值大,则更新最大值
			max = props.data[i].stopTime;
		}
	}
	let backData = new Array(props.data.length).fill(max + 1);
	const getArrByKey = (data: any, k: string) => {
		let key = k || "value";
		let res: Array<number> = [];
		if (props.data) {
			props.data.forEach(function (t: any) {
				res.push(t[key]);
			});
		}
		return res;
	};
	const dataZoomEndValue = 6; // 数据窗口范围的结束数值(一次性展示几个)
	let yAxisIndex2 = 0; // 表示右侧Y轴从那个刻度开始

	const option = {
		grid: {
			top: "10%",
			bottom: "-6%",
			right: "2%",
			left: 0,
			containLabel: true
		},
		dataZoom: [
			{
				show: false, // 是否显示滑动条
				yAxisIndex: [0, 1], // // 表示这个 dataZoom 组件控制 第一个 和 二个 yAxis
				startValue: 0, // 数据窗口范围的起始数值
				endValue: dataZoomEndValue // 数据窗口范围的结束数值(一次性展示几个)
			}
		],
		xAxis: {
			show: false
		},
		yAxis: [
			{
				triggerEvent: true,
				show: true,
				inverse: true,
				data: getArrByKey(props.data, "name"),
				axisLine: {
					show: false
				},
				splitLine: {
					show: false
				},
				axisTick: {
					show: false
				},
				axisLabel: {
					interval: 0,
					color: "#8693a4",
					align: "right",
					margin: 18,
					fontSize: 12,
					fontWeight: 400
				}
			},
			{
				name: "时长         占比",
				//name的样式设计
				nameTextStyle: {
					align: "left",
					padding: [-220, 0, 0, 0], //地区名称的位置
					color: "#8693a4",
					fontSize: "12"
				},
				triggerEvent: true,
				show: true,
				inverse: true,
				data: getArrByKey(props.data, "name"),
				axisLine: {
					show: false
				},
				splitLine: {
					show: false
				},
				axisTick: {
					show: false
				},
				axisLabel: {
					interval: 0,
					color: "#8693a4",
					align: "left",
					margin: 0,
					fontSize: 12,
					fontWeight: 400,
					formatter: function (value: any, index: number) {
						// return `<div style="width: 100px; display: flex;justify-content: space-between;align-items: center;"><span>${
						// 	props.data[index + yAxisIndex2].stopTime
						// }</span><span>${props.data[index + yAxisIndex2].stopTimeRatio}%</span></div>`;
						// return props.data[index + yAxisIndex2].stopTime + "     " + props.data[index + yAxisIndex2].stopTimeRatio + "%";
						return (
							"{a|" +
							props.data[index + yAxisIndex2].stopTime +
							"}" +
							"{b|" +
							"     " +
							props.data[index + yAxisIndex2].stopTimeRatio +
							"%" +
							"}"
						);
					},
					rich: {
						a: {
							width: 40
						},
						b: {
							width: 40
						}
					}
				}
			}
		],
		series: [
			{
				name: "条",
				type: "bar",
				yAxisIndex: 0,
				data: props.data.map((item: any) => item.stopTime),
				barWidth: 10,
				itemStyle: {
					color: "#e82461",
					barBorderRadius: [0, 30, 30, 0]
				}
			},
			{
				// For shadow
				type: "bar",
				itemStyle: {
					normal: {
						color: "rgba(255, 255, 255, 0.1)",
						barBorderRadius: [0, 0, 0, 0]
					}
				},
				barWidth: 10,
				barGap: "-100%",
				barCategoryGap: "40%",
				data: backData,
				animation: false,
				yAxisIndex: 1, //使用右侧y轴
				tooltip: {
					show: false
				}
			}
		]
	};

	if (props.data.length > 0 && myChart) {
		useEcharts(myChart, option);
	} else {
		myChart.clear(); //清除图表所有配置项
	}

	// 开启定时器自动滚动
	if (getArrByKey(props.data, "name").length > dataZoomEndValue && props.data.length > dataZoomEndValue) {
		timer = setInterval(() => {
			// 每次向后滚动一个,最后一个从头开始
			if (option.dataZoom[0].endValue === getArrByKey(props.data, "value").length - 1) {
				option.dataZoom[0].startValue = 0; // 数据窗口范围的起始数值
				option.dataZoom[0].endValue = dataZoomEndValue; // 数据窗口范围的结束数值
				yAxisIndex2 = 0;
			} else {
				option.dataZoom[0].startValue = option.dataZoom[0].startValue + 1; // 数据窗口范围的起始数值
				option.dataZoom[0].endValue = option.dataZoom[0].endValue + 1; // 数据窗口范围的结束数值
				yAxisIndex2 += 1;
			}
			myChart?.setOption(option);
		}, 2000);
	}
};
onMounted(() => {
	initPieChart();
});
onBeforeUnmount(() => {
	clearInterval(timer);
});
</script>

<style lang="scss" scoped></style>

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

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

相关文章

【0-1系列】从0-1快速了解搜索引擎是什么以及怎么用(上)

友情链接 社区开发版安装部署与使用教程社区版家族V2024.5版本更新说明 START>>1.快速了解搜索引擎 什么是搜索引擎数据库 搜索引擎数据库是一类专门用于数据内容搜索的NoSQL数据库&#xff0c;是非结构化大数据处理分析领域中重要的基础支撑软件。 伴随互联网、移动…

scene graph generation benchmark关于visual genome的数据划分(train,test,val)

scene graph generation benchmark关于visual genome的数据划分&#xff08;train&#xff0c;test&#xff0c;val&#xff09; 前言 前言 很多做scene graph generation&#xff0c;准备测试的同学&#xff0c;发现visual genome并没有提供官方的训练train&#xff0c;测试t…

竞赛选题 python opencv 深度学习 指纹识别算法实现

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python opencv 深度学习 指纹识别算法实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;4分创新点&#xff1a;4分 该项目较为新颖…

【AI大模型】基于ChatGLM-6b从零开始本地部署语言模型,步骤详细无坑版

1.什么是ChatGLM-6B ChatGLM-6B 是的一种自然语言处理模型&#xff0c;属于大型生成语言模型系列的一部分。"6B"在这里指的是模型大约拥有60亿个参数&#xff0c;这些参数帮助模型理解和生成语言。ChatGLM-6B 特别设计用于对话任务&#xff0c;能够理解和生成自然、…

Linux 软链接

# 语法 ln -s <文件夹or文件的真实路径> <自定义路径别名> # 例子 ln -s /etc/sysconfig/network-scripts/ifcfg-ens33 ~/ens33

Android集成mapbox教程

目录 简介准备工作创建Token系统开发简介 Mapbox是来自美国的一家为开发者提供地图服务和开发工具的开放平台。Mapbox以开源的形式构建了矢量瓦片技术生态,开发了矢量切片工具、瓦片服务传输框架。Mapbox的底图平台非常受欢迎,特别是开发者和学生群体,可以使用免费的开源软…

matlab结合python的CoolProp库来进行热泵热循环仿真

前言 需要安装python&#xff0c;不同matlab版本需要下载对用的python版本&#xff01;&#xff01;&#xff01;&#xff01;&#xff0c;切记&#xff01;&#xff01;&#xff01;&#xff01;否则程序无法运行&#xff0c;下图是展示了matlab和python之间的版本对应 安装…

数据分析思考

数据分析工作流程 在我的数据分析职业发展过程中&#xff0c;我从基础的数据提取工作开始&#xff0c;逐步深入到更为复杂和具有战略意义的领域。这包括构建和完善指标体系、设计风险预警模型&#xff0c;以及与多部门协作完成公司整体经营分析等工作。 在这个过程中&#xf…

会声会影2024旗舰版汉化最新安装包下载方法步骤

嗨&#xff0c;亲爱的CSDN的朋友们&#xff01;&#x1f389;今天&#xff0c;我要跟大家分享一款让你的视频编辑体验升级的神器——会声会影2024最新版本&#xff01;✨如果你是一个热衷于创作视频内容的创作者&#xff0c;那么你一定不能错过这个软件。它不仅功能强大&#x…

为什么企业需要数据挖掘平台?哪个比较好呢?

什么是数据挖掘&#xff1f; 数据挖掘就是从大量的数据中去发现有用的信息&#xff0c;然后根据这些信息来辅助决策。听起来是不是跟传统的数据分析很像呢&#xff1f;实际上&#xff0c;数据挖掘就是智能化的数据分析&#xff0c;它们的目标都是一样的。但是&#xff0c…

前端面试js高频手写大全

res.push(fn(arr[i])) } return res } 3. reduce实现数组的map方法 Array.prototype.myMap function(fn,thisValue){ var res []; thisValue thisValue||[]; this.reduce(function(pre,cur,index,arr){ return res.push(fn.call(thisValue,cur,index,arr)); },[])…

【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】

卷积经常用在信号处理中&#xff0c;用于计算信号的延迟累积。假设一个信号发射器每个时刻 t t t产生一个信号 x t x_t xt​&#xff0c;其信息的衰减率为 w k w_k wk​&#xff0c;即在 k − 1 k-1 k−1个时间步长后&#xff0c;信息为原来的 w k w_k wk​倍&#xff0c;时刻 …

PMBOK® 第六版 指导与管理项目工作

目录 读后感—PMBOK第六版 目录 我们都不情愿去做重复的工作&#xff0c;也不期望只得到一个计划&#xff0c;而具体的工作任务却笼统模糊&#xff0c;需要在做的过程中一边摸索。如此一来&#xff0c;对于熟悉的事情会因反复而影响心态&#xff0c;对于不熟悉的事情则由于痛苦…

在SQL中使用explode函数展开数组的详细指南

目录 简介示例1&#xff1a;简单数组展开示例2&#xff1a;展开嵌套数组示例3&#xff1a;与其他函数结合使用处理结构体数组示例&#xff1a;展开包含结构体的数组示例2&#xff1a;展开嵌套结构体数组 总结 简介 在处理SQL中的数组数据时&#xff0c;explode函数非常有用。它…

pytorch十大核心操作

PyTorch的十大核心操作涵盖了张量创建、数据转换、操作变换等多个方面。以下是结合参考文章信息整理出的PyTorch十大核心操作的概述&#xff1a; 张量创建&#xff1a; 从Python列表或NumPy数组创建张量。使用特定值创建张量&#xff0c;如全零、全一、指定范围、均匀分布、正…

AI与区块链的融合:Web3时代下的新应用探索

本文来源香港Web3媒体Techub News AI与区块链&#xff1a;Web3时代的新机遇 在香港这座金融与科技交汇的繁荣都市&#xff0c;AI与区块链的结合已经成为Web3时代的重要议题&#xff0c;为行业发展带来了新的可能性和机遇。越来越多的开发者正在积极探索这一领域的融合&#xff…

FlinkCDC 3.1.0 与 Flink 1.18.0 安装及使用 Mysql To Doris 整库同步,使用 pipepline连接器

cd flink-cdc-3.1.0 bin/flink-cdc.sh 会用到 linux的系统环境变量&#xff08;vim /etc/profile配置&#xff09;&#xff0c;使用环境变量 FLINK_HOME flinkcdc & flink 安装及使用&#xff1a; 1、flink-cdc-3.1.0/lib/ 内容如下&#xff1a; 2、flink-cdc-3.1.0/mysql…

win10免安装配置MySQL8.4.0

注&#xff1a;此教程基于win10 22H2 版本 1、下载最新版本MySQL压缩包 下载链接&#xff1a;MySQL官网下载地址 点击第二行的 ZIP Archive 后面的Download&#xff08;当前时间2024-06-19最新版本是8.4.0&#xff09; 2、解压并添加配置文件 下载完毕后&#xff0c;解压缩…

Ncorr使用过程的问题解答

问题系列 文章目录 问题系列前言一、如何更改单位&#xff1f;情景&#xff1a;DIC Analysis 二、拉格兰日和欧拉绘图的区别直观 三、控制图像中的显示条上下界限问题展示&#xff1a;解决方案&#xff1a; 更新动态 前言 主要用于记录使用过程中出现的相关问题。 一、如何更改…

k8s中 docker和containerd 镜像相互导入导出

containerd镜像导出并导入docker 1 查看containerd 本地镜像列表 crictl images 2 containerd 导出本地镜像到当前目录下&#xff08;注意&#xff1a; 导出导入需要指定镜像平台类型 --platform&#xff09; ctr -n k8s.io images export nacos-server-24-06-30-13-02-…