echarts实现甘特图(项目进度/任务进度)

1.先看效果图:

 

 2.代码部分我只贴出来option部分,其余的都是一样的;也可参考官网地址:

https://www.echartsjs.com/examples/zh/index.html#chart-type-bar

https://www.echartsjs.com/zh/option.html#title

3.

var option = {
    backgroundColor: "#fff",
    title: {
        text: "项目工期",
        padding: 20,
        textStyle: {
            fontSize: 17,
            fontWeight: "bolder",
            color: "#333"
        },
        subtextStyle: {
            fontSize: 13,
            fontWeight: "bolder"
        }
    },
    legend: {
        data: ["计划工期", "可行性研究阶段", "初步设计阶段", "施工图设计阶段", "项目实施阶段", "项目验收阶段"],
        align: "right",
        right: 80,
        top: 50
    },
    grid: {
        containLabel: true,
        show: false,
        right: 130,
        left: 40,
        bottom: 40,
        top: 90
    },
    xAxis: {
        type: "time",
        axisLabel: {
            "show": true,
            "interval": 0
        }
    },
    yAxis: {
        axisLabel: {
            show: true,
            interval: 0,
            formatter: function(value, index) {
                var last = ""
                var max = 5;
                var len = value.length;
                var hang = Math.ceil(len / max);
                if (hang > 1) {
                    for (var i = 0; i < hang; i++) {
                        var start = i * max;
                        var end = start + max;
                        var temp = value.substring(start, end) + "\n";
                        last += temp; //凭借最终的字符串
                    }
                    return last;
                } else {
                    return value;
                }
            }
        },
        data: ["第一个任务", "第二个任务", "第三个任务"]
    },
    tooltip: {
        trigger: "axis",
        formatter: function(params) {
            var res = "";
            var name = "";
            var start0 = "";
            var start = "";
            var end0 = "";
            var end = "";
            for (var i in params) {
                var k = i % 2;
                if (!k) { //偶数
                    start0 = params[i].data;
                    console.log(start0)
                    start = start0.getFullYear() + "-" + (start0.getMonth() + 1) + "-" + start0.getDate();
                }
                if (k) { //奇数
                    name = params[i].seriesName;
                    end0 = params[i].data;
                    end = end0.getFullYear() + "-" + (end0.getMonth() + 1) + "-" + end0.getDate();
                    res += name + " : " + end + "~" + start + "</br>";

                }
            }
            return res;
        }
    },
    series: [{
            name: "计划工期",
            type: "bar",
            stack: "总量0",
            label: {
                normal: {
                    show: true,
                    color: "#000",
                    position: "right",
                    formatter: function(params) {
                        return params.seriesName
                    }
                }
            },
            itemStyle: {
                normal: {
                    color: "skyblue",
                    borderColor: "#fff",
                    borderWidth: 2
                }
            },
            zlevel: -1,
            data: [
                new Date("2020-05-01"), 
                new Date("2020-03-14"), 
                new Date("2020-05-01")]
        },
        {
            name: "计划工期",
            type: "bar",
            stack: "总量0",
            itemStyle: {
                normal: {
                    color: "white",
                }
            },
            zlevel: -1,
            z: 3,
            data: [
                new Date("2020-01-01"), 
                new Date("2020-01-01"), 
                new Date("2020-03-15")]
        },
        {
            name: "可行性研究阶段",
            type: "bar",
            stack: "总量2",
            label: {
                normal: {
                    show: true,
                    color: "#000",
                    position: "right",
                    formatter: function(params) {
                        return params.seriesName
                    }
                }
            },
            itemStyle: {
                normal: {
                    color: "green",
                    borderColor: "#fff",
                    borderWidth: 2
                }
            },
            zlevel: -1,
            data: [
                new Date("2020-01-10"), 
                new Date("2020-01-10"), 
                new Date("2020-03-30")]
        },
        {
            name: "可行性研究阶段",
            type: "bar",
            stack: "总量2",
            itemStyle: {
                normal: {
                    color: "white",
                }
            },
            zlevel: -1,
            z: 3,
            data: [
                new Date("2020-01-02"), 
                new Date("2020-01-02"), 
                new Date("2020-03-16")]
        },
        {
            name: "初步设计阶段",
            type: "bar",
            stack: "总量3",
            label: {
                normal: {
                    show: true,
                    color: "#000",
                    position: "right",
                    formatter: function(params) {
                        return params.seriesName
                    }
                }
            },
            itemStyle: {
                normal: {
                    color: "red",
                    borderColor: "#fff",
                    borderWidth: 2
                }
            },
            zlevel: -1,
            data: [
                new Date("2020-02-20"), 
                new Date("2020-01-20"), 
                new Date("2020-04-10")]
        },
        {
            name: "初步设计阶段",
            type: "bar",
            stack: "总量3",
            itemStyle: {
                normal: {
                    color: "white"
                }
            },
            zlevel: -1,
            z: 3,
            data: [
                new Date("2020-02-01"), 
                new Date("2020-01-12"), 
                new Date("2020-04-01")]
        },
        {
            name: "施工图设计阶段",
            type: "bar",
            stack: "总量4",
            label: {
                normal: {
                    show: true,
                    color: "#000",
                    position: "right",
                    formatter: function(params) {
                        return params.seriesName
                    }
                }
            },
            itemStyle: {
                normal: {
                    color: "brown",
                    borderColor: "#fff",
                    borderWidth: 2
                }
            },
            zlevel: -1,
            data: [
                new Date("2020-03-09"), 
                new Date("2020-01-25"), 
                new Date("2020-04-20")]
        },
        {
            name: "施工图设计阶段",
            type: "bar",
            stack: "总量4",
            itemStyle: {
                normal: {
                    color: "white",
                }
            },
            zlevel: -1,
            z: 3,
            data: [
                new Date("2020-02-25"), 
                new Date("2020-01-21"), 
                new Date("2020-04-11")]
        },
        {
            name: "项目实施阶段",
            type: "bar",
            stack: "总量5",
            label: {
                normal: {
                    show: true,
                    color: "#000",
                    position: "right",
                    formatter: function(params) {
                        return params.seriesName
                    }
                }
            },
            itemStyle: {
                normal: {
                    color: "yellow",
                    borderColor: "#fff",
                    borderWidth: 2
                }
            },
            zlevel: -1,
            data: [
                new Date("2020-03-12"), 
                new Date("2020-02-15"), 
                new Date("2020-04-30")]
        },
        {
            name: "项目实施阶段",
            type: "bar",
            stack: "总量5",
            itemStyle: {
                normal: {
                    color: "white",
                }
            },
            zlevel: -1,
            z: 3,
            data: [
                new Date("2020-03-10"), 
                new Date("2020-01-26"), 
                new Date("2020-04-21")]
        },
        {
            name: "项目验收阶段",
            type: "bar",
            stack: "总量6",
            label: {
                normal: {
                    show: true,
                    color: "#000",
                    position: "right",
                    formatter: function(params) {
                        return params.seriesName
                    }
                }
            },
            itemStyle: {
                normal: {
                    color: 'orange',
                    borderColor: "#fff",
                    borderWidth: 2
                }
            },
            zlevel: -1,
            data: [
                new Date("2020-03-30"), 
                new Date("2020-03-13"), 
                new Date("2020-05-01")]
        },
        {
            name: "项目验收阶段",
            type: "bar",
            stack: "总量6",
            itemStyle: {
                normal: {
                    color: 'white',
                }
            },
            zlevel: -1,
            z: 3,
            data: [
                new Date("2020-03-15"), 
                new Date("2020-02-16"), 
                new Date("2020-04-30")]
        },
    ]
}

 

### 如何使用 ECharts 创建甘特图 要通过 ECharts 创建甘特图,可以按照以下方法操作。ECharts 提供了丰富的 API 和配置选项来支持复杂的数据可视化需求。 #### 配置项说明 ECharts甘特图主要依赖于 `series` 中的 `type: 'gantt'` 类型[^1]。以下是常见的配置项: - **data**: 数据数组,定义任务的时间范围和其他属性。 - **itemStyle**: 设置图形样式,如颜色、边框等。 - **label**: 控制标签显示的内容和位置。 - **markPoint** / **markLine**: 添加标记点或线用于突出特定时间点或区间。 - **tooltip**: 自定义提示框内容,在鼠标悬停时展示更多信息。 #### 示例代码 下面是一个完整的示例代码片段,展示了如何利用 ECharts 构建基本的甘特图: ```javascript // 初始化图表实例 var chartDom = document.getElementById('ganttChart'); var myChart = echarts.init(chartDom); // 图表配置 var option = { tooltip: { trigger: 'axis', axisPointer: { type: 'line' } }, legend: {}, xAxis: { type: 'time', // 时间轴 splitLine: { show: false } }, yAxis: { type: 'category', data: ['Task A', 'Task B', 'Task C'] // 任务名称列表 }, series: [{ type: 'gantt', itemStyle: { color: '#009cff' }, data: [ { name: 'Task A', start: '2023-01-01', end: '2023-01-07' }, // 起始时间和结束时间 { name: 'Task B', start: '2023-01-08', end: '2023-01-15' }, { name: 'Task C', start: '2023-01-16', end: '2023-01-22' } ] }] }; myChart.setOption(option); ``` 此代码初始化了一个 DOM 容器并加载了基础的甘特图结构,其中包含了三个任务及其对应的时间段。 #### Vue3 环境下的集成 如果是在 Vue3 项目中,则可以通过安装相关插件完成更便捷的操作。具体步骤如下: 1. 使用 NPM 命令安装必要的库文件: ```bash npm install echarts vue-echarts ``` 2. 在组件内部引入 ECharts 并绑定至模板中的指定区域: ```vue <template> <div ref="chartRef" style="width: 100%; height: 400px;"></div> </template> <script setup> import * as echarts from 'echarts'; import { onMounted, ref } from 'vue'; const chartRef = ref(null); onMounted(() => { const initGanttChart = () => { var myChart = echarts.init(chartRef.value); var option = { tooltip: { ... }, xAxis: { ... }, yAxis: { ... }, series: [{...}] }; myChart.setOption(option); }; initGanttChart(); }); </script> ``` 以上实现了基于 Vue3 的动态渲染功能[^2]。 --- #### 结合其他工具扩展应用 除了单独使用外,还可以借助 SpreadJS 这样的表格控件进一步增强交互体验。例如采用其内置的日程管理模块配合 ECharts 展现更加直观的效果[^3]。 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值