echarts甘特图-工厂生产计划-甘特图

63 篇文章 1 订阅
1 篇文章 0 订阅

在这里插入图片描述

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
        }]
    }

参考文档:https://gallery.echartsjs.com/editor.html?c=xjzbwfaAO7

let data = [{
        "list": [{
                "colorNum": 0,
                "endTime": '10',
                "name": "在线",
                "quantity": 10,
                "startTime": '0',
            },
            {
                "colorNum": 1,
                "endTime": "20",
                "name": "离线",
                "quantity": 10,
                "startTime": "12",
            },
            {
                "colorNum": 2,
                "endTime": "30",
                "name": "故障",
                "quantity": 10,
                "startTime": "25",
            },
            {
                "colorNum": 3,
                "endTime": '55',
                "name": "繁忙",
                "quantity": 10,
                "startTime": '50',
            },

        ],
        "plant": ""
    },
    



]
// let start_ = "0",
//     end_ = "60"; //自定义时间
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 = 0;
        // let endTime = 60;
        seriesData.push({
            name: listItem.name,
            value: [
                index,
                listItem.startTime,
                listItem.endTime,
                listItem.quantity,
            ],
            itemStyle: {
                normal: {
                    color: bgColor
                }
            }
        });
    })

});

option = {
    backgroundColor: '#26263C',
    tooltip: {
        formatter: function(params) {
            //console.log(params)
            return params.marker + params.name + params.value;
        }
    },

    legend: {
      show: true,
    //   icon: "circle",
      itemWidth: 16,
      itemHeight: 16,
      itemGap: 13,
      data: ['在线', '离线', '故障', '繁忙'],
      x: 'center',
      y: 'center',
      textStyle: {
        fontSize: 12,
        color: "#fff",
      },
    },
    grid: {
        top: 48,
        left: 100,
        right: 50,
        bottom: 50,
        height: 300,
    },

    xAxis: {
        type: '',
        min: 0,
        max: 60,
        scale: true,
        position: 'buttom',
        splitNumber: 6,
       axisLabel: {
            show: true,
            interval: 0,
            color: '#fff',
        },
        axisLine: {
            lineStyle: {
                color: '#38384d',
                width: 1, //这里是为了突出显示加上的
            }
        },
        splitLine: {
            show: true,
            lineStyle: {
                color: 'rgba(233,233,233,0.1)'
            }
        },

        axisTick: {
            lineStyle: {
                color: '#38384d'
            }
        }
    },
    yAxis: {
        axisLine: {
            onZero: false,
            show: false
        },
        
        axisLabel: {
            show: true,
            textStyle: {
                color: '#ffffff'
            },
            fontSize: 14
        },
        splitLine: {
            show: false,
            lineStyle: {
                color: ''
            }
        },
        inverse: false,
        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
    },
        {
            show: false,
        type: 'radar',
        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
    },

    ]
}
  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ECharts是一个功能强大的可视化库,提供了多种常见的数据可视化图表,如折线图、柱状图、散点图、饼图等,但是它没有内置的甘特图功能。然而,你可以利用ECharts的一些属性和技巧来实现绘制甘特图。 首先,可以使用ECharts的stack属性来实现数据的堆叠,将同一类别轴上的系列设置相同的stack值,可以使后一个系列的值在前一个系列的值上相加并堆叠在同一条数据上。其次,可以利用z属性来控制条状图的层叠顺序,通过将开始时间的z值设置得比结束时间大,可以实现开始时间的条状图覆盖结束时间的条状图。 此外,为了实现甘特图的效果,需要注意一些细节处理。首先,在开始时间和结束时间的位置上,需要传入一整组数据,并在对应的位置赋值,其余位置保持为空,以确保开始时间和结束时间位于同一起点并实现覆盖效果。其次,可以将开始时间的条状图设置为背景色,将结束时间的条状图边框设置为背景色,以达到所需的效果。 总结来说,虽然ECharts没有直接提供甘特图的功能,但是通过使用ECharts的stack和z属性,并巧妙地处理数据和样式,你可以实现绘制甘特图的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [如何使用ECharts绘制甘特图](https://blog.csdn.net/bDreamer/article/details/120653359)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值