vue echarts 甘特图功能

index.vue


<template><div ref="echart" id="echart" class="echart"></div>
</template><script setup>import { nextTick, onMounted, ref } from "vue";import * as echarts from "echarts";let colorTheme = ["#4150d8","#28bf7e","#ed7c2f","#ff0000","#f9cf36","#4a5bdc","#7b04f4","#ee04f4","#04a0f4","#1af404","#d4f404","#f404f1",];const YData = ["示例1", "示例2", "示例3", "示例5", "示例6", "示例6", "示例7"];// 0 代表y轴索引(示例的下标)   后面0 代表 甘特图一个数据有多行  0 代表1个 1 代表2个// [0, "2021-07-19 03:29:19", "2021-07-19 08:38:50", 0]**多个数组代表多组数据,即每种“示例”会在多个时间段分布**let showData = [[{value: [0, "2021-07-19 03:29:19", "2021-07-19 08:38:50", 0],},{value: [1, "2021-07-19 03:53:07", "2021-07-19 21:00:08", 0],},{value: [4, "2021-07-19 03:29:19", "2021-07-19 08:38:50", 0],},],[{value: [0, "2021-07-19 05:00:00", "2021-07-19 06:08:02", 0],},{value: [1, "2021-07-19 00:00:00", "2021-07-19 05:08:02", 0],},{value: [3, "2021-07-19 00:00:00", "2021-07-19 05:08:02", 0],},],];// 分配y值const produceSeries = (data) => {let len = data.length;let step = len % 2 == 1 ? -5 : 2;let series = [];data.map((val, index) => {// if (step == -5) {series.push(configSeriec(val, index, 0));step = step + 30;// return;// }// if (index % 2 == 0) {//   series.push(configSeriec(val, index, step));//   step = step + 20;// } else {//   series.push(configSeriec(val, index, -step));//   step = step + 10;// }});function configSeriec(val, index, step) {return {type: "custom",renderItem: (params, api) => {//开发者自定义的图形元素渲染逻辑,是通过书写 renderItem 函数实现的var categoryIndex = api.value(0); //这里使用 api.value(0) 取出当前 dataItem 中第一个维度的数值。var start = api.coord([api.value(1), categoryIndex]); // 这里使用 api.coord(...) 将数值在当前坐标系中转换成为屏幕上的点的像素值。var end = api.coord([api.value(2), categoryIndex]);var height = 10;return {type: "rect", // 表示这个图形元素是矩形。还可以是 'circle', 'sector', 'polygon' 等等。y: step,shape: echarts.graphic.clipRectByRect({// 矩形的位置和大小。x: start[0],y: start[1] - height / 2,width: end[0] - start[0],height: height,},{// 当前坐标系的包围盒。x: params.coordSys.x,y: params.coordSys.y,width: params.coordSys.width,height: params.coordSys.height,}),style: api.style(),};},encode: {x: [1, 2], // data 中『维度1』和『维度2』对应到 X 轴y: 0, // data 中『维度0』对应到 Y 轴},itemStyle: {normal: {color: function (params) {//return colorTheme[params.value[0]];return colorTheme[index];},},},data: val,};}return series;};let option = {title: {text: "",top: "1%",x: "center",textStyle: {fontSize: 20,color: "#333333",},},tooltip: {enterable: true,backgroundColor: "rgba(255,255,255,1)", //背景颜色(此时为默认色)borderRadius: 5, //边框圆角padding: 10, // [5, 10, 15, 20] 内边距textStyle: {color: "#000",},position: function (point, params, dom, rect, size) {dom.innerHTML = params.name + '<br/>' +'开始时间:' + params.value[1] + '<br/>' +'结束时间:' + params.value[2];},},legend: {auto: true//   //图例//   data: "我是图例",//   left: "90px",//   top: 22,//   itemWidth: 16,//   itemHeight: 16,//   selectedMode: false, // 图例设为不可点击//   textStyle: {//     color: "#333333",//     fontSize: 16,//   },},// grid: {//   top: 10,//   bottom: 10,//   left: 100,//   right: 20,//   containLabel: true// },xAxis: {name: "",nameTextStyle: {color: "#333333",fontSize: 18,},position: 'top',type: "time",splitNumber: 6,max: "2021-07-20 00:00:00",min: "2021-07-19 00:00:00", //将data里最小时间的整点时间设为min,否则min会以data里面的min为开始进行整点递增axisLabel: {show: true,formatter: function (value) {//在这里写你需要的时间格式var t_date = new Date(value);let month = t_date.getMonth() + 1;let day = t_date.getDate();let hours = t_date.getHours();let minutes = t_date.getMinutes();return ([t_date.getFullYear(),month < 10 ? '0' + month : month,day < 10 ? '0' + day : day,].join("-") +"\n" +[hours < 10 ? '0' + hours : hours, minutes < 10 ? '0' + minutes : minutes].join(" : "));},},splitLine: {show: true,lineStyle: {color: "#333333",},},axisLine: {show: true,color: "#333333",// symbol: ["none", "arrow"],lineStyle: {color: "#333333",width: 1,type: "solid",},},},yAxis: {name: "",nameTextStyle: {color: "#333333",fontSize: 18,},axisLine: {color: "#333333",lineStyle: {color: "#333333",},},axisLabel: {show: true,textStyle: {color: "#333333", //这里用参数代替了},},data: YData,},dataZoom: [// {//   show: true,//   realtime: true,//   start: 0,//   end: 100,//   height: 20,//   borderColor: "rgba(43,48,67,0.5)",//   fillerColor: "#269cdb", //滑动块的颜色//   backgroundColor: "rgba(44, 92, 170, 0.35)", //两边未选中的滑动条区域的颜色//   xAxisIndex: [0, 1],//   width: "86%",// },// {//   type: "inside",//   realtime: true,//   start: 30,//   end: 70,//   // xAxisIndex: [0, 1],// },{type: "slider",show: true,// 设置组件控制的y轴yAxisIndex: 0,right: 15,// top: 60,// 数据窗口范围的起始百分比。范围是:0 ~ 100。表示 0% ~ 100%// 也可以用 startValue设置起始值// start: "0",// end: "50",maxSpan: 20,maxValueSpan: 5, // 最大显示y轴的条数width: 10, //滚动条的粗细// height: 450,// 组件的背景颜色// left: 600, //左边的距离// right: 8,//右边的距离borderRadius: 8,borderColor: "rgba(43,48,67,0.5)",fillerColor: "#269cdb", //滑动块的颜色backgroundColor: "rgba(44, 92, 170, 0.35)", //两边未选中的滑动条区域的颜色// 是否显示detail,即拖拽时候显示详细数值信息showDetail: false,// 控制手柄的尺寸handleSize: 16,// 是否在 dataZoom-silder 组件中显示数据阴影。数据阴影可以简单地反应数据走势。showDataShadow: false,// zoomLock: true, //禁止拖拽   y轴固定,不能拉长滚动条},{type: "inside",yAxisIndex: [0],start: 1,end: 36,// 鼠标滚轮Y轴能触发缩放  false  禁止滚轮缩放   true  滚轮可以缩放// zoomOnMouseWheel: false,// 不按任何功能键,鼠标移动能触发数据窗口平移moveOnMouseMove: true,moveOnMouseWheel: true},],series: produceSeries(showData),};let echart = ref();let myChart;const setDatas = (XData, YData) => {option.yAxis.data = YData;option.series = produceSeries(XData);myChart.setOption(option);myChart.resize();}onMounted(() => {nextTick(() => {myChart = echarts.init(echart.value);option.yAxis.data = YData;option.series = produceSeries(showData);myChart.setOption(option);});});const watchResize = () => {setTimeout(() => {myChart.resize();}, 200)}//暴露方法,父组件才能调用defineExpose({setDatas,watchResize,})
</script>
<style lang="less">.echart {width: 100%;height: 1000px;}
</style>

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

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

相关文章

Pandas使用教程:从入门到实战的数据分析利器

一、Pandas基础入门 1.1 什么是Pandas Pandas是Python生态中核心的数据分析库&#xff0c;提供高效的数据结构&#xff08;Series/DataFrame&#xff09;和数据分析工具。其名称源于"Panel Data"&#xff08;面板数据&#xff09;和"Python Data Analysis"…

NuttX Socket 源码学习

概述 NuttX 的 socket 实现是一个精心设计的网络编程接口&#xff0c;提供了标准的 BSD socket API。该实现采用分层架构设计&#xff0c;支持多种网络协议族&#xff08;如 TCP/IP、UDP、Unix域套接字等&#xff09;&#xff0c;具有良好的可扩展性和模块化特性。 整体架构设…

基于YOLO的语义分割实战(以猪的分割为例)

数据集准备 数据集配置文件 其实语义分割和目标检测类似&#xff0c;包括数据集制备、存放格式基本一致像这样放好即可。 然后需要编写一个data.yaml文件&#xff0c;对应的是数据的配置文件。 train: C:\图标\dan\语义分割pig\dataset\train\images #绝对路径即可 val: C:\…

钉钉智能会议室集成指纹密码锁,临时开门密码自动下发

在当今快节奏的工作环境中&#xff0c;会议室的高效管理和使用成为了企业提升工作效率的关键一环。湖南某知名企业近期成功升级了原有使用的钉钉智能会议室系统&#xff0c;并配套使用了启辰智慧联网指纹密码锁&#xff0c;实现了会议室管理的智能化升级&#xff0c;提升了会议…

C++讲解—类(1)

类 在 C 中&#xff0c;类是一个关键概念&#xff0c;凭借其封装和继承的特性&#xff0c;能够助力程序员之间实现高效的分工协作&#xff0c;共同完成复杂的大型项目。我们先从最简单的概念入手&#xff0c;再进行更深层次的了解和应用。 1. 类的定义 类是用户自定义的一种…

什么是Hadoop Yarn

Hadoop YARN&#xff1a;分布式集群资源管理系统详解 1. 什么是YARN&#xff1f; YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Apache Hadoop 生态系统中的资源管理和作业调度系统&#xff0c;最初在 Hadoop 2.0 中引入&#xff0c;取代了 Hadoop 1.0 的…

项目开发中途遇到困难的解决方案

1. 正视困难&#xff0c;避免逃避 开发遇阻时&#xff0c;退缩会带来双重损失&#xff1a;既成为"失败者逃兵"&#xff0c;又损害职业信心1。 行动建议&#xff1a; 立即向团队透明化问题&#xff08;如进度延迟、技术瓶颈&#xff09;&#xff0c;避免问题滚雪球…

Blender硬表面建模篇收集学习建模过程中的Demo

c 齿轮 创建一个圆柱体&#xff0c;选择侧面的所有&#xff0c;然后进行隔断选择&#xff0c;两次挤出面&#xff0c;一次缩放面&#xff0c;通过圆柱面三次插入面缩放挤出得到齿轮中心&#xff0c;选中齿轮的锯齿中间&#xff0c;然后进行相同周长选择行选择齿与齿中间的面&…

Chromium 136 编译指南 macOS篇:获取源代码(四)

1. 引言 在现代软件开发的宏大版图中&#xff0c;源代码的获取往往标志着从理论探索向实践应用的关键转折。对于Chromium 136这样一个拥有超过2500万行代码、涉及数百个第三方库的超大规模开源项目而言&#xff0c;源代码的获取不仅仅是简单的文件下载&#xff0c;更是一个涉及…

OpenCV C++ 边缘检测与图像分割

一、边缘检测 在数字图像处理领域&#xff0c;边缘检测是一项至关重要的基础技术。它如同为图像赋予 “骨架”&#xff0c;帮助计算机快速识别图像中的物体轮廓、形状与结构&#xff0c;广泛应用于目标识别、图像分割、图像配准等多个领域。 1.1 概念 边缘检测的核心目标是找…

线段树(2025年6月14日)

原文 https://www.beiweidoge.top/132.html P1&#xff1a;求最大值1 题目描述 题目描述 小明给了你n个数字&#xff0c;你需要依次输出&#xff1a; 1到n的最大值&#xff0c;1到n/2的最大值&#xff0c;n/21到n的最大值&#xff0c;1到n/4的最大值&#xff0c;n/41到n/2…

渗透实战PortSwigger Labs AngularJS DOM XSS利用详解

本Lab学习到关于AngularJS的 xss 漏洞利用 直接输入回显页面&#xff0c;但是把<>进了 html 编码了 当我们输入{{11}}&#xff0c;没有当作字符处理&#xff0c;而是执行了 {{}} 是多种前端框架&#xff08;如 Vue、Angular、Django 模板等&#xff09;中常见的模板插值语…

Ubuntu 多网卡安全路由配置(SSH 不断线版)

Ubuntu 多网卡路由配置笔记&#xff08;内网 外网同时通&#xff09;&#xff08;SSH断线版&#xff09;文章浏览阅读386次&#xff0c;点赞4次&#xff0c;收藏5次。本文介绍了Ubuntu 如何配置双网卡设备的路由规则&#xff0c;使默认流量走外网&#xff08;192.168.2.0/24&a…

基于昇腾NPU部署llamafactory单机多卡微调Qwen3教程

1. 进入华为云 华为云首页 点击右上角控制台 2.进入ModelArts 点击搜索框->搜索“ModelArts”->选择AI开发平台ModelArts->进入平台后点击开发者空间 3.创建Notebook 3.1在开发者空间中点击Notebook->在西南贵阳一下点击创建Notebook 3.2进入创建Notebook页…

关于XES文件格式诸多问题

1. 格式类型是什么&#xff1f; case:concept:name (案例ID) - 必须是字符串类型concept:name (活动名称) - 字符串类型time:timestamp - 必须是datetime类型 2. 如何修改&#xff1f; data[case:concept:name] data[case:concept:name].astype(str)data[concept:name] data…

数据融合平台有哪些?在数据治理中发挥什么作用?

目录 一、常见的数据融合平台 &#xff08;一&#xff09;传统数据融合平台 &#xff08;二&#xff09;实时数据融合平台 &#xff08;三&#xff09;云数据融合平台 二、数据融合平台在数据治理中的作用 &#xff08;一&#xff09;提升数据质量 &#xff08;二&#…

​​Linux:XFS 文件系统扩容完整指南

​​​问题背景​​ 在扩展 Linux 根目录 / 时,我遇到了一个错误: sudo resize2fs /dev/uos/root resize2fs: 超级块中的幻数有错 尝试打开 /dev/uos/root 时找不到有效的文件系统超级块。 经过排查,发现根本原因是 ​​文件系统类型是 XFS​​,而 resize2fs 仅适用于 e…

网络安全之CTF专题赛RE题解

easyre hap文件改成zip格式然后解压去反编译abc文件即可拿到源码 这里推荐一个网站.abcD 蛮好用的 下载反编译结果&#xff0c;解压后用vscode打开分析。 这里可以看到一些目录结构&#xff0c;我们先看看flag目录 x_2_2.count位1000000的时候就会输出flag那么大概率是一个点…

a padding to disable MSIE and Chrome friendly error page

问题 a padding to disable MSIE and Chrome friendly error page 解决 nginx 代理地址 配错了

71、C# Parallel.ForEach 详解

Parallel.ForEach 是 .NET Framework 4.0 引入的并行编程功能的一部分&#xff0c;位于 System.Threading.Tasks 命名空间中。它允许你对集合中的元素进行并行处理&#xff0c;可以显著提高处理大量数据时的性能。 基本用法 using System; using System.Collections.Generic;…