用vue和echarts怎么寫一個甘特圖,并且是分段式瀑布流

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;…