当前位置: 首页 > article >正文

ECharts甘特图实战:5分钟搞定项目进度可视化(附完整代码)

ECharts甘特图实战5分钟搞定项目进度可视化附完整代码项目管理中进度可视化是团队协作的核心需求。传统表格难以直观展示任务依赖关系而专业项目管理软件又过于笨重。ECharts作为国内最流行的数据可视化库其灵活的配置和强大的交互能力恰好能解决这个痛点。本文将手把手教你用ECharts的条形图功能快速搭建一个专业级的项目进度甘特图。1. 环境准备与基础配置在开始之前确保你的开发环境已经引入最新版ECharts。推荐通过npm安装npm install echarts --save或者直接在HTML中引入CDN链接script srchttps://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js/script基础配置中有几个关键参数需要特别注意grid控制图表与容器的边距建议设置containLabel:true避免文字截断xAxis甘特图必须使用time类型坐标轴yAxis需要自定义label的formatter处理长文本换行const option { grid: { containLabel: true, left: 3%, right: 4%, bottom: 3%, top: 15% }, xAxis: { type: time, axisLabel: { formatter: {yyyy}-{MM}-{dd} } }, yAxis: { axisLabel: { formatter: function(value) { return value.length 6 ? value.substring(0,6)... : value } } } }2. 核心数据结构设计甘特图的本质是堆叠条形图每个任务需要两组数据占位数据白色背景条确定任务起始位置实际数据彩色进度条显示任务持续时间const tasks [ { name: 需求分析, phases: [ {name: 计划, start: 2024-01-01, end: 2024-01-05, color: #c23531}, {name: 实际, start: 2024-01-02, end: 2024-01-07, color: #2f4554} ] }, // 更多任务... ]转换函数示例function generateSeries(tasks) { const series []; tasks.forEach(task { // 添加占位系列 series.push({ name: task.name, type: bar, stack: background, itemStyle: { color: transparent }, data: [[task.phases[0].start, task.name]] }); // 添加实际进度系列 task.phases.forEach(phase { series.push({ name: phase.name, type: bar, stack: task.name, itemStyle: { color: phase.color }, data: [[phase.start, phase.end, task.name]] }); }); }); return series; }3. 高级交互功能实现基础甘特图搭建完成后可以添加以下增强功能3.1 动态时间范围选择const timeRangeSelector { buttons: [{ type: day, count: 7, text: 1周 }, { type: month, count: 1, text: 1月 }], selected: 0 } // 添加到option中 option.dataZoom [{ type: slider, filterMode: weakFilter, ...timeRangeSelector }];3.2 任务进度提示框优化默认tooltip显示option.tooltip { trigger: axis, formatter: function(params) { const taskName params[0].axisValue; let result strong${taskName}/strongbr; params.forEach(param { if(param.seriesName ! taskName) { const start param.data[0]; const end param.data[1]; result ${param.seriesName}: ${formatDate(start)} → ${formatDate(end)}br; } }); return result; } }; function formatDate(date) { if (typeof date string) date new Date(date); return ${date.getMonth()1}/${date.getDate()}; }3.3 关键路径高亮通过额外系列标记关键任务const criticalSeries { name: 关键路径, type: effectScatter, symbolSize: 10, itemStyle: { color: #ff0000, shadowBlur: 10, shadowColor: #ff0000 }, data: criticalTasks.map(task ({ name: task.name, value: [task.end, task.name] })) };4. 企业级应用方案4.1 与后端API集成典型的数据接口响应格式{ project: 电商平台升级, tasks: [ { id: T001, name: 支付系统重构, owner: 张伟, phases: [ {type: plan, start: 2024-03-01, end: 2024-03-15}, {type: actual, start: 2024-03-05, end: 2024-03-20} ] } ] }前端数据处理逻辑async function fetchAndRenderGantt() { const response await fetch(/api/project/progress); const data await response.json(); const tasks data.tasks.map(task ({ name: ${task.name} (${task.owner}), phases: task.phases.map(phase ({ name: phase.type plan ? 计划 : 实际, start: phase.start, end: phase.end, color: phase.type plan ? #c4c4c4 : #1890ff })) })); chart.setOption({ series: generateSeries(tasks) }); }4.2 性能优化技巧当任务数量超过100时需要采取优化措施启用渐进渲染option.animationThreshold 100; option.progressive 200; option.progressiveThreshold 300;简化视觉效果series: [{ // ... itemStyle: { opacity: 0.8, borderWidth: 0 // 去除边框提升渲染性能 }, emphasis: { // 仅悬停时显示细节 itemStyle: { borderWidth: 1, borderColor: #333 } } }]4.3 响应式布局方案监听容器尺寸变化const chart echarts.init(document.getElementById(gantt-container)); function resizeChart() { chart.resize(); } // 使用ResizeObserver更精确 const observer new ResizeObserver(resizeChart); observer.observe(chart.getDom()); // 基础响应式配置 option.grid { left: 3%, right: window.innerWidth 768 ? 3% : 8%, top: 15%, bottom: 15% };5. 常见问题解决方案5.1 时间显示异常排查现象日期显示为数字而非格式化时间解决确保xAxis类型设置为time并检查数据格式// 错误示例 data: [2024-01-01, 2024-01-02] // 正确示例 data: [ [new Date(2024-01-01), Task 1], [new Date(2024-01-02), Task 1] ]5.2 任务堆叠错位处理当出现任务堆叠异常时检查所有相关series的stack值是否一致确保占位系列与实际进度系列的stack分组正确验证数据中的时间范围是否有效调试技巧// 在控制台输出堆叠计算结果 echarts.registerAction({ type: gantt:debug, event: gantt:debug, update: none }, function(payload, ecModel) { console.log(ecModel.getSeriesByIndex(0).getStackedData()); });5.3 大数据量优化方案当处理500任务时建议启用数据采样option.dataZoom [{ type: inside, throttle: 100, startValue: 2024-01-01, endValue: 2024-03-01 }];使用Web Worker处理数据转换// worker.js self.onmessage function(e) { const series generateSeries(e.data); self.postMessage(series); }; // 主线程 const worker new Worker(worker.js); worker.postMessage(largeTaskData); worker.onmessage function(e) { chart.setOption({ series: e.data }); };6. 完整实现代码示例以下是一个可直接运行的完整示例!DOCTYPE html html head meta charsetutf-8 titleECharts甘特图/title script srchttps://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js/script style #gantt-container { width: 100%; height: 600px; } /style /head body div idgantt-container/div script const chart echarts.init(document.getElementById(gantt-container)); const tasks [ { name: 需求分析, phases: [ {name: 计划, start: 2024-01-01, end: 2024-01-07, color: #c4c4c4}, {name: 实际, start: 2024-01-02, end: 2024-01-09, color: #1890ff} ] }, { name: UI设计, phases: [ {name: 计划, start: 2024-01-08, end: 2024-01-15, color: #c4c4c4}, {name: 实际, start: 2024-01-10, end: 2024-01-18, color: #13c2c2} ] } ]; const option { tooltip: { trigger: axis }, legend: { data: [计划, 实际] }, grid: { containLabel: true, left: 100 }, xAxis: { type: time }, yAxis: { type: category, data: tasks.map(t t.name) }, series: [ { name: 占位, type: bar, stack: total, itemStyle: { color: transparent }, data: tasks.map(t [t.phases[0].start, t.name]) }, { name: 计划, type: bar, stack: total, itemStyle: { color: #c4c4c4 }, data: tasks.map(t [t.phases[0].start, t.phases[0].end, t.name]) }, { name: 实际, type: bar, stack: total, itemStyle: { color: #1890ff }, data: tasks.map(t [t.phases[1].start, t.phases[1].end, t.name]) } ] }; chart.setOption(option); window.addEventListener(resize, chart.resize); /script /body /html

相关文章:

ECharts甘特图实战:5分钟搞定项目进度可视化(附完整代码)

ECharts甘特图实战:5分钟搞定项目进度可视化(附完整代码) 项目管理中,进度可视化是团队协作的核心需求。传统表格难以直观展示任务依赖关系,而专业项目管理软件又过于笨重。ECharts作为国内最流行的数据可视化库&…...

Pixel Mind Decoder 创意写作助手:分析经典文学中的情绪节奏与模仿生成

Pixel Mind Decoder 创意写作助手:分析经典文学中的情绪节奏与模仿生成 1. 当AI遇见文学创作 写作最难把握的是什么?很多作家会告诉你:是情绪的节奏。就像音乐需要起伏的旋律,一部好作品也需要精心设计的情感曲线。但传统创作中…...

基于Docker与Orthanc构建轻量级医学影像PACS系统实践

1. 为什么选择DockerOrthanc搭建PACS系统 第一次接触医学影像管理系统时,我被传统PACS的复杂部署流程吓到了——需要配置数据库、安装依赖库、调试网络参数,光是环境准备就要花上大半天。直到发现Orthanc这个宝藏工具,配合Docker容器化技术&a…...

告别手动gc.collect()!2026 Python内存自适应策略上线:动态分代阈值、对象生命周期AI建模、NUMA感知分配器三合一

第一章:Python 智能体内存管理策略 2026 最新趋势Python 在 2026 年已深度融入 AI 基础设施与边缘智能体(Intelligent Agent)系统,其内存管理机制正从传统引用计数 循环检测双层模型,演进为感知式、上下文驱动的动态调…...

Python金融计算效率翻倍的7个隐藏技巧:pandas加速300%、numba编译优化、向量化避坑指南

第一章:Python金融计算效率翻倍的底层逻辑与性能瓶颈诊断Python在金融量化分析中广泛应用,但其默认解释执行机制常导致大规模时间序列回测、蒙特卡洛模拟或协方差矩阵运算时出现显著延迟。效率瓶颈并非源于算法本身,而集中于CPython解释器的G…...

如何在Windows上实现高效完整的安卓应用安装:APK-Installer进阶指南

如何在Windows上实现高效完整的安卓应用安装:APK-Installer进阶指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer APK-Installer是一款专为Windows系统设…...

GBase 8a数据库运维管理系统GDOM运营商应用案例

2025年某运营商全面上线部署南大通用GBase 8a(gbase database)数据库运维管理系统GDOM,替换原有脚本Zabbix 的监控管理模式,并对接集团统一分布式底座管理平台,实现对湖仓各技术栈产品的统一纳管。通过升级 GDOM,实现了…...

抖音批量下载终极指南:5分钟掌握免费视频资源整合技巧

抖音批量下载终极指南:5分钟掌握免费视频资源整合技巧 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 你是不是经常看到精彩的抖音视频想保存下来,却苦于一个个手动下载太麻烦&#x…...

NW.js 保姆级教程来了!零基础也能开发桌面应用(2026 最新版)

一句话总结:用你熟悉的 HTML CSS JavaScript,直接打包成 Windows / macOS / Linux 桌面程序——这就是 NW.js 的魔力! 一、NW.js 到底是什么?别再和 Electron 搞混了! 如果你会前端开发,但一直以为“做桌…...

Hearthstone-Script:炉石传说自动化脚本的革新实践

Hearthstone-Script:炉石传说自动化脚本的革新实践 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-S…...

Source Han Serif CN字体架构解析:从技术实现到设计应用的完整技术栈

Source Han Serif CN字体架构解析:从技术实现到设计应用的完整技术栈 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字排版的演进历程中,中文字体技术长期…...

Clawdbot+Python爬虫实战:自动化数据采集与智能分析

ClawdbotPython爬虫实战:自动化数据采集与智能分析 1. 为什么数据采集需要Clawdbot这样的智能体 你有没有遇到过这样的场景:市场部同事凌晨三点发来消息,“老板急要竞品价格数据,明早九点前要出分析报告”。你打开浏览器&#x…...

ETS5保姆级教程:从零配置KNX智能开关,实现灯光、窗帘、场景联动

ETS5保姆级教程:从零配置KNX智能开关,实现灯光、窗帘、场景联动 KNX作为智能家居领域的国际标准协议,以其稳定性和灵活性备受推崇。而ETS5则是配置KNX系统的核心工具,掌握它意味着你能够自由定制属于自己的智能家居方案。本教程将…...

CMock函数模拟全解析:从ExpectAndReturn到Callback的高级用法指南

CMock函数模拟全解析:从ExpectAndReturn到Callback的高级用法指南 单元测试是软件开发中不可或缺的一环,而C语言开发者常常面临一个难题:如何有效地测试那些依赖外部系统或复杂模块的函数?这正是CMock大显身手的地方。作为Ceedlin…...

QWen 3.5plus总结的总结基准测试结果的正确方法

原文地址:https://dl.acm.org/doi/epdf/10.1145/5666.5673 如何用统计撒谎:总结基准测试结果的正确方法 作者:PHILIP J. FLEMING 和 JOHN J. WALLACE 在文献中,性能结果经常使用性能比率的算术平均值来总结,在某些情况…...

从软件到硬件:Taalas ASIC如何让AI成为“物理基础设施”

当AI推理速度突破15000 tokens/秒,我们谈论的不再是“更快的服务”,而是“消失的延迟”。过去两年,大模型领域的竞争焦点高度集中在算力堆叠和参数规模上。GPU成为稀缺资源,英伟达H200、B200的发布一次次刷新算力上限,…...

新手避坑指南:用Arduino Uno和CNC Shield V3驱动42步进电机(附完整代码与接线图)

新手避坑指南:用Arduino Uno和CNC Shield V3驱动42步进电机(附完整代码与接线图) 刚拿到Arduino Uno和CNC Shield V3时,你可能迫不及待想驱动42步进电机完成第一个项目。但现实往往是:电机纹丝不动、发出奇怪噪音&…...

探索照片转3D模型:用Meshroom实现7步从2D到3D的蜕变

探索照片转3D模型:用Meshroom实现7步从2D到3D的蜕变 【免费下载链接】Meshroom 3D Reconstruction Software 项目地址: https://gitcode.com/gh_mirrors/me/Meshroom 定位3D重建价值:打破技术壁垒的开源方案 在数字创作领域,3D模型一…...

标签噪声鲁棒训练:从理论到实践,构建深度学习模型的抗噪防线

1. 标签噪声:深度学习中的隐形杀手 第一次用MNIST数据集跑分类模型时,我发现哪怕故意把20%的标签打乱,模型在测试集上依然能达到85%以上的准确率。这个结果让我误以为深度神经网络对标签噪声天然具有免疫力——直到后来在医疗影像分类项目里…...

FPGA时序优化全攻略:Vivado 2019.2中的建立与保持时间问题解决

FPGA时序优化全攻略:Vivado 2019.2中的建立与保持时间问题解决 在高速FPGA设计中,时序问题往往是工程师面临的最大挑战之一。当设计频率提升到200MHz甚至更高时,建立时间和保持时间的违例会频繁出现,导致设计无法正常工作。本文将…...

JAVA集成CAS客户端总结

一、依赖<dependency><groupId>org.jasig.cas.client</groupId><artifactId>cas-client-support-springboot</artifactId><version>3.6.4</version></dependency>二、yml配置cas:server-url-prefix: https://xxx.xxx:8443/cas…...

AI辅助创作:Krita智能选区工具效率提升指南

AI辅助创作&#xff1a;Krita智能选区工具效率提升指南 【免费下载链接】krita-vision-tools Krita plugin which adds selection tools to mask objects with a single click, or by drawing a bounding box. 项目地址: https://gitcode.com/gh_mirrors/kr/krita-vision-too…...

AI选型与配置:让快马智能推荐npm包并生成个人博客系统前端代码

最近在尝试用AI辅助开发个人博客系统&#xff0c;发现整个过程比想象中顺畅很多。特别是依赖管理和技术选型这个环节&#xff0c;AI能帮我们省去大量查文档和试错的时间。下面记录下我的实践过程&#xff0c;或许对同样想快速搭建博客的朋友有帮助。 需求明确化阶段 首先需要…...

文墨共鸣大模型生成技术教程:以“计算机组成原理”为例的课件与习题制作

文墨共鸣大模型生成技术教程&#xff1a;以“计算机组成原理”为例的课件与习题制作 作为一名在技术领域摸爬滚打了十多年的从业者&#xff0c;我见过太多优秀的工具因为“用起来太麻烦”而被束之高阁。今天&#xff0c;我想和你分享一个让我眼前一亮的“AI助教”——文墨共鸣…...

职场生存暗规则 DAY5:同事抢你功劳?用这 1 招让他偷鸡不成蚀把米|乐想屋

“本文来自「乐想屋」公众号&#xff0c;系列更新[职场反PUA30天觉醒计][职场生存暗规则]&#xff0c;读完你未必能立即升职加薪&#xff0c;但一定能避开那些让99%的人莫名出局的深坑。职场这场游戏&#xff0c;活下去&#xff0c;才能赢下去。”——————————————…...

Ansys与Adams刚柔耦合仿真实战:从模态分析到MNF文件生成全流程解析

1. 为什么需要刚柔耦合仿真&#xff1f; 刚接触机械系统仿真的朋友可能会有疑问&#xff1a;为什么不能直接用刚性体模型做动力学分析&#xff1f;这个问题我刚开始做项目时也纠结过。简单来说&#xff0c;现实世界中没有绝对的刚性体&#xff0c;所有物体在受力时都会发生形变…...

Qwen-Image-Layered场景实战:用AI图层技术为你的产品图换背景

Qwen-Image-Layered场景实战&#xff1a;用AI图层技术为你的产品图换背景 1. 引言 1.1 电商设计的痛点 在电商运营中&#xff0c;产品主图的质量直接影响转化率。传统换背景流程需要设计师手动抠图、调整边缘、匹配光影&#xff0c;一个产品图往往需要30分钟以上的处理时间。…...

WebGIS驱动的智慧校园导航系统:架构设计与功能实现全解析

1. WebGIS如何让校园导航更智能&#xff1f; 第一次接触校园导航系统是在三年前&#xff0c;当时某高校的IT部门负责人向我吐槽&#xff1a;学生们总在开学季迷路&#xff0c;传统纸质地图根本不够用。这让我意识到&#xff0c;基于WebGIS的智慧导航系统不是锦上添花&#xff0…...

WorkshopDL:跨平台资源获取的开源工具解决方案

WorkshopDL&#xff1a;跨平台资源获取的开源工具解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 在游戏模组生态中&#xff0c;跨平台资源访问与高效下载一直是技术爱…...

OpenFeign性能优化最全实战

Feign 就是动态代理 模板化 HTTP 请求&#xff0c;帮你把接口方法自动转成 HTTP 调用。 完整执行流程&#xff08;8 步&#xff09; 启动时&#xff1a;FeignClient 接口被 Feign 扫描&#xff0c;生成动态代理类 调用时&#xff1a;执行接口方法 → 进入代理类 解析注解&…...