echarts 甘特图一组显示多组数据

news2024/9/23 16:23:38

 

<template>
    <el-button type="primary" @click="addlin">添加线</el-button>
    <el-button type="success" @click="addArea">添加区域</el-button>
    <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",
];
// 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", 1],
        },
        {
            value: [2, "2021-07-19 03:29:19", "2021-07-19 08:38:50", 0],
        },
    ],
    [
        {
            value: [0, "2021-07-19 00:00:00", "2021-07-19 05:08:02", 0],
        },
        {
            value: [1, "2021-07-19 00:00:00", "2021-07-19 05:08:02", 0],
        },
        {
            value: [2, "2021-07-19 00:00:00", "2021-07-19 05:08:02", 0],
        },
    ],
    [
        {
            value: [0, "2021-07-19 00:00:00", "2021-07-19 05:08:02", 2],
        },
        {
            value: [1, "2021-07-19 00:00:00", "2021-07-19 05:08:02", 2],
        },
        {
            value: [2, "2021-07-19 00:00:00", "2021-07-19 05:08:02", 2],
        },
    ],
    [
        {
            value: [0, "2021-07-19 10:00:00", "2021-07-19 15:08:02", 3],
        },
        {
            value: [1, "2021-07-19 10:00:00", "2021-07-19 15:08:02", 3],
        },
        {
            value: [2, "2021-07-19 10:00:00", "2021-07-19 15:08:02", 3],
        },
    ],
    [
        {
            value: [0, "2021-07-19 10:00:00", "2021-07-19 15:08:02", 4],
        },
        {
            value: [1, "2021-07-19 10:00:00", "2021-07-19 15:08:02", 4],
        },
        {
            value: [2, "2021-07-19 10:00:00", "2021-07-19 15:08:02", 4],
        },
    ],
];

let linflag = false;
const addlin = () => {
    linflag = !linflag;
    option.series = option.series.map((item) => {
        item.markLine = {
            data: [],
        };
        return item;
    });

    if (linflag) {
        option.series[0].markLine = {
            //使用警戒线
            symbol: "none", //取消警戒线箭头
            silent: "true", //图形是否不响应和触发鼠标事件,默认为 false,即响应和触发鼠标事件
            data: [{ xAxis: "2021-07-19 10:53:07" }],
            label: {
                show: true,
                color: "red",
                fontSize: 20,
                formatter: "",
            },
            lineStyle: {
                //线条颜色与线条虚实
                color: colorTheme[0], //航线的颜色
                type: "scrollDataIndex",
            },
        };
    }

    myChart.setOption(option);
};

let areaflag = false;
const addArea = () => {
    areaflag = !areaflag;
    option.series = option.series.map((item) => {
        item.markArea = {
            data: [],
        };
        return item;
    });
    if (areaflag) {
        option.series[0].markArea = {
            itemStyle: {
                color: "rgba(0,0,0,0.2)",
            },
            data: [
                [
                    { xAxis: "2021-07-19 03:29:19" },
                    { xAxis: "2021-07-19 08:29:19" },
                ],
            ],
        };
    }
    myChart.setOption(option);
};
// 分配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 = {
    // grid: {
    //     left: "5%",
    //     right: "7%",
    //     bottom: "5%",
    //     containLabel: false,
    // },
    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.value[1] + "~" + params.value[2];
        },
    },

    legend: {
        //图例
        data: "我是图例",
        left: "90px",
        top: 22,
        itemWidth: 16,
        itemHeight: 16,
        selectedMode: false, // 图例设为不可点击
        textStyle: {
            color: "#333333",
            fontSize: 16,
        },
    },
    toolbox: {
        show: true,
        feature: {
            saveAsImage: {},
        },
    },
    xAxis: {
        name: "场景时间",
        nameTextStyle: {
            color: "#333333",
            fontSize: 18,
        },
        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);
                return (
                    [
                        t_date.getFullYear(),
                        t_date.getMonth() + 1,
                        t_date.getDate(),
                    ].join("-") +
                    " " +
                    [t_date.getHours(), t_date.getMinutes()].join(":")
                );
            },
        },

        splitLine: {
            show: true,
            lineStyle: {
                color: "#333333",
            },
        },
        axisLine: {
            show: true,
            color: "#333333",
            symbol: ["none", "arrow"],
            lineStyle: {
                color: "#333333",
                width: 1,
                type: "solid",
            },
        },
    },
    yAxis: {
        name: "y轴",
        nameTextStyle: {
            color: "#333333",
            fontSize: 18,
        },
        axisLine: {
            color: "#333333",
            lineStyle: {
                color: "#333333",
            },
            symbol: ["none", "arrow"],
        },
        axisLabel: {
            show: true,
            textStyle: {
                color: "#333333", //这里用参数代替了
            },
        },
        data: ["示例1", "示例2", "示例3"],
    },
    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: 3, // 最大显示y轴的条数
            width: 20, //滚动条的粗细
            // 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,
            // 不按任何功能键,鼠标移动能触发数据窗口平移
        },
    ],
    series: produceSeries(showData),
};

let echart = ref();
let myChart;
onMounted(() => {
    nextTick(() => {
        console.log(echart.value);
        myChart = echarts.init(echart.value);
        myChart.setOption(option);
    });
});
</script>
<style  lang="less">
.echart {
    width: 100%;
    height: 1000px;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/922319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用友T3 T6 服务无法启动 windows10 11等操作系统 T3服务没有开启

windows 10 11 等高版本操作系统故障。 于2023-08-23日大量爆发。。 导致原因&#xff0c;windows操作系统根证书颁发机构吊销或已到期。 正版软件请打11.2最新补丁即可解决。 如果是老版本需要修复证书才可以。

阿里云机器学习PAI全新推出特征平台 (Feature Store),助力AI建模场景特征数据高效利用

推荐算法与系统在全球范围内已得到广泛应用&#xff0c;为用户提供了更个性化和智能化的产品推荐体验。在推荐系统领域&#xff0c;AI建模中特征数据的复用、一致性等问题严重影响了建模效率。阿里云机器学习平台 PAI 推出特征平台&#xff08;PAI-FeatureStore&#xff09; 。…

通过IP地址如何防范钓鱼网站诈骗?

随着互联网的普及和发展&#xff0c;钓鱼网站诈骗的风险日益增加。钓鱼网站通过伪装成合法网站&#xff0c;诱导用户输入个人敏感信息进而进行非法活动。IP地址作为网络通信的基本单位&#xff0c;可以在一定程度上帮助我们防范钓鱼网站诈骗。本文将探讨IP地址防范钓鱼网站诈骗…

错过这5大AI绘画提示词平台,你会拍大腿!别问,直接收藏!

如今&#xff0c;AI绘画已经不再是简单的技术展示&#xff0c;而是逐渐转向了商业化的运营。 有的人利用AI生成的图片&#xff0c;再结合ChatGPT产生的文字&#xff0c;然后在平台上发布&#xff0c;这样就可以赚取平台的广告费。 其他一些变现操作参考之前的文章&#xff1a;…

不同版本NodeJS切换使用

问题&#xff1a;有时候两个项目同时进行&#xff0c;用的nodejs版本不同&#xff0c;这时候需要来回切换nodejs版本&#xff0c;怎么办呢&#xff1f; 1、下载安装node版本管理器nvm 下载地址 2、检查是否安装好 3、设置nvm淘宝镜像 nvm node_mirror https://npm.taobao.o…

POI groupRow 折叠分组,折叠部分不显示问题

折叠组是什么&#xff1f;如图就是用POI 实现的&#xff0c;代码很简单&#xff1a;sheet.groupRow(开始行&#xff0c;结束行)即可 但是万万没想到&#xff0c;最终实现出的结果&#xff0c;合并的组&#xff0c;有一部分并没有渲染出来&#xff0c;如下图&#xff1a; 因为我…

Postman测WebSocket接口

01、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直…

【python】Leetcode(primer-dict-list)

文章目录 260. 只出现一次的数字 III&#xff08;字典 / 位运算&#xff09;136. 只出现一次的数字&#xff08;字典&#xff09;137. 只出现一次的数字 II&#xff08;字典&#xff09;169. 求众数&#xff08;字典&#xff09;229. 求众数 II&#xff08;字典&#xff09;200…

C语言编写图形界面 | 移动小球示例

文章目录 其他文章最终结果设计过程定义小球的属性窗口过程函数绘制小球空格回弹小球碰壁 完整代码 其他文章 部分知识可以查看如下文章&#xff1a; C语言编写注册窗口 最终结果 先放一下本篇文章最终结果展示图吧&#xff0c;如图&#xff0c;一个绿色的小球&#xff0c;在…

《数字图像处理-OpenCV/Python》连载(2)目录

《数字图像处理-OpenCV/Python》连载&#xff08;2&#xff09;目录 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第一部分 OpenCV-Python的基本操作 第1章 …

一篇搞懂浏览器的工作原理(万字详解)

摘要 本文是学习极客时间上的课程&#xff0c;进而整理出的浏览器工作原理。 第一部分&#xff1a;浏览器的进程和线程 &#xff08;1&#xff09;进程和线程的区别&#xff1f; 在浏览器中&#xff0c;各个进程负责处理自己的事情&#xff0c;而不同的进程中&#xff0c;也…

Android多线程开发核心知识点

什么是线程并发安全 线程安全的本质是能够让并发线程&#xff0c;有序的运行(这个有序可能是先来后到的排队&#xff0c;有可能有人插队&#xff0c;但是不管怎么着&#xff0c;同一时刻只能一个线程有权访问同步资源)&#xff0c;线程执行的结果&#xff0c;能够对其他线程可…

C语言实例_数据压缩与解压

一、压缩与解压介绍 数据压缩是通过一系列的算法和技术将原始数据转换为更紧凑的表示形式&#xff0c;以减少数据占用的存储空间。数据解压缩则是将压缩后的数据恢复到原始的表示形式。 数据可以被压缩打包并减少空间占用的原因有以下几个方面&#xff1a; &#xff08;1&am…

Python支持下Noah-MP陆面模式站点、区域模拟及可视化分析

熟悉陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作用&#xff1b;深入理解Noah-MP 5.0模型的原理&#xff0c;掌握Noah-MP模型&#xff08;2023年最新发布的5.0版本&#xff09;所需的系统环境与编译环境的搭建方法及模型实践运行&#xff0c;熟悉linux系统操…

高忆管理大盘行情:美股开盘时间?

股票商场是一个充满生机的环境&#xff0c;而美股作为全球最具生机和最具影响力的股票商场之一&#xff0c;被投资者和买卖员广泛关注。美股开盘时刻是众多投资者和买卖员最为关心的问题之一&#xff0c;由于不同的买卖时刻会对在商场中进行投资产生重要影响。那么&#xff0c;…

虹科分享 | 如何构建深度防御层 | 自动移动目标防御

在当今的威胁环境中&#xff0c;多层纵深防御是安全团队获得安心的唯一方法之一。 为什么?有两个原因: 1、攻击面越来越大 随着DevOps等远程工作和数字化转型项目的兴起&#xff0c;攻击面已经超出了大多数安全团队的定义能力。创建一个完全安全的网络边界是不可能的。正如…

计算机视觉-图形处理基础

一、环境安装 1、anaconda安装 官网下载&#xff1a;Free Download | Anaconda 2、打开anaconda prompt测试是否安装成功 输入conda env list命令显示虚拟环境清单即可 二、创建开发虚拟环境 1、创建python3.8虚拟环境 conda create --name demo_py3.8 python3.8 2、激…

ubuntu18 编译ROS代码 报“cxx_attribute_deprecated”is not know to CXX compiler

编译代码报错如下&#xff1a; 通常用两种解决方式&#xff1a; 1&#xff1a;先检查一下 编写的CMakeList.txt的文件中&#xff0c;所包含、链接的文件和库是否都存在且引用正确&#xff08;仔细的查看了一下&#xff0c;都是正确的&#xff09; 2&#xff1a;查看一下cmake…

iOS 17 及 Xcode 15.0 Beta7 问题记录

1、iOS 17 真机调试问题 iOS 17之后&#xff0c;真机调试Beta版本必须使用Beta版本的Xcode来调试&#xff0c;用以前复制DeviceSupport 方式无法调试&#xff0c;新的Beta版本Xcode中&#xff0c;已经不包含 iOS 17目录。如下图&#xff1a; 解决方案&#xff1a; 1&#x…

数据驱动的胜利:体育赛事的可视化之道

当前&#xff0c;体育赛事遍地开花&#xff0c;智能体育也不断成熟。体育赛事不断与物联网、数字孪生等新一代信息技术深入融合&#xff0c;创新运动方式&#xff0c;推动全民健身&#xff0c;促进产业升级。数字孪生可视化平台易知微也一直致力于体育领域的数字化发展&#xf…