甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。其通过条状图来显示项目、进度和其他时间相关的系统进展的内在关系随着时间进展的情况。以提出者亨利·劳伦斯·甘特(Henry Laurence Gantt)先生的名字命名。
代码示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.1/dist/echarts.min.js"></script> </head> <body> <!-- 为 ECharts 准备一个定义了宽高的 DOM --> <div id="main" style="width: 1200px; height: 400px"></div> <script> let data = [ { list: [ { colorNum: 0, endTime: "2018-08-02 14:00:00", item: "item1", quantity: 1960, startTime: "2018-08-02 8:00:00", }, { colorNum: 1, endTime: "2018-08-04 12:00:00", item: "item2", quantity: 492, startTime: "2018-08-04 08:00:00", }, { colorNum: 2, endTime: "2018-08-04 18:00:00", item: "item3", quantity: 20837, startTime: "2018-08-04 14:00:00", }, { colorNum: 3, endTime: "2018-08-05 12:00:00", item: "item4", quantity: 3620, startTime: "2018-08-04 20:00:00", }, { colorNum: 0, endTime: "2018-08-05 24:00:00", item: "item5", quantity: 7200, startTime: "2018-08-05 14:00:00", }, ], plant: "工厂1", }, { list: [ { startTime: "2018-08-03 12:00:00", endTime: "2018-08-04 12:00:00", quantity: 20, colorNum: 0, item: "item6", }, ], plant: "工厂2", }, { list: [ { startTime: "2018-08-04 12:00:00", endTime: "2018-08-06 00:00:00", quantity: 30, colorNum: 0, item: "item7", }, { startTime: "2018-08-06 08:00:00", endTime: "2018-08-06 12:00:00", quantity: 20, colorNum: 1, item: "item8", }, { startTime: "2018-08-06 14:00:00", endTime: "2018-08-08 12:00:00", quantity: 10, colorNum: 2, item: "item9", }, { startTime: "2018-08-08 20:00:00", endTime: "2018-08-10 12:00:00", quantity: 10, colorNum: 3, item: "item10", }, ], plant: "工厂3", }, { list: [ { startTime: "2018-08-02 20:00:00", endTime: "2018-08-03 12:00:00", quantity: 20, colorNum: 1, item: "item11", }, { startTime: "2018-08-03 20:00:00", endTime: "2018-08-04 12:00:00", quantity: 15, colorNum: 2, item: "item12", }, { startTime: "2018-08-04 20:00:00", endTime: "2018-08-05 12:00:00", quantity: 15, colorNum: 3, item: "item13", }, ], plant: "工厂4", }, ]; let start_ = "2018-08-02 00:00:00", end_ = "2018-11-05 24:00:00"; //自定义时间 let seriesData = []; let yAxisData_plant = []; //工厂名 data.forEach((item, index) => { yAxisData_plant.push(item.plant); let bgColor; item.list.forEach((listItem, listIndex) => { switch (listItem.colorNum) { case 0: bgColor = "rgba(0,187,255,.4)"; break; case 1: bgColor = "rgba(80,227,194,.4)"; break; case 2: bgColor = "rgba(255,115,115,.4)"; break; case 3: bgColor = "rgba(255,207,107,.4)"; break; default: bgColor = "rgba(0,187,255,.4)"; } let startTime = new Date(listItem.startTime).getTime(); let endTime = new Date(listItem.endTime).getTime(); seriesData.push({ name: listItem.item, value: [index, startTime, endTime, listItem.quantity], itemStyle: { normal: { color: bgColor, }, }, }); }); }); option = { backgroundColor: "#26263C", tooltip: { formatter: function (params) { //console.log(params) return params.marker + params.name; }, }, grid: { top: 48, left: 100, right: 50, bottom: 50, height: 300, }, dataZoom: [ { show: true, type: "slider", filterMode: "none", realtime: false, height: 10, top: 370, startValue: new Date(start_).getTime(), endValue: new Date(start_).getTime() + 3600 * 24 * 1000 * 7, minValueSpan: 3600 * 24 * 1000 * 7, handleIcon: "path://path://M100, 100m -75, 0a75,75 0 1,0 150,0a75,75 0 1,0 -150,0", handleSize: "120%", handleStyle: { color: "#fff", shadowColor: "rgba(0, 0, 0, 0.5)", shadowBlur: 4, }, textStyle: { color: "transparent", }, borderColor: "transparent", backgroundColor: "#D7F4FF", dataBackground: { lineStyle: { width: 0, }, areaStyle: { color: "transparent", }, }, fillerColor: "#00EBFF", labelFormatter: "", }, { type: "inside", show: true, zoomOnMouseWheel: false, moveOnMouseWheel: true, moveOnMouseMove: true, preventDefaultMouseMove: true, }, ], xAxis: { type: "time", min: new Date(start_).getTime(), max: new Date(end_).getTime(), scale: true, position: "top", splitNumber: 7, axisLabel: { show: true, textStyle: { color: "#ffffff" }, interval: 0, margin: 15, fontSize: 14, formatter: function (value, index) { var date = new Date(value); var texts = [date.getFullYear(), date.getMonth() + 1, date.getDate()].join("/"); return texts; }, }, axisLine: { show: false }, splitLine: { show: true, lineStyle: { color: "rgba(233,233,233,0.1)" }, }, axisTick: { lineStyle: { color: "#fff", }, }, }, yAxis: { axisLine: { onZero: false, show: false, }, axisLabel: { show: true, textStyle: { color: "#ffffff" }, fontSize: 14, }, splitLine: { show: true, lineStyle: { color: "rgba(233,233,233,0.1)" }, }, inverse: true, data: yAxisData_plant, }, series: [ { type: "custom", renderItem: function (params, api) { var categoryIndex = api.value(0); var start = api.coord([api.value(1), categoryIndex]); var end = api.coord([api.value(2), categoryIndex]); var height = api.size([0, 1])[1] * 0.6; var rectShape = echarts.graphic.clipRectByRect( { x: start[0], y: start[1] - 5, width: end[0] - start[0], height: 10, }, { x: params.coordSys.x, y: params.coordSys.y, width: params.coordSys.width, height: params.coordSys.height, } ); return ( rectShape && { type: "rect", shape: rectShape, style: api.style(), } ); }, encode: { x: [1, 2], y: 0, }, data: seriesData, }, ], }; // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById("main")); // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); </script> </body> </html>
复制
效果如下

参考: https://echarts.apache.org/examples/zh/editor.html?c=custom-gantt-flight&theme=dark