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

 

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

18-使用钩子函数判断用户登录权限-登录前缀

钩子函数的两种应用: (1). 应用在app上 before_first_request before_request after_request teardown_request (2). 应用在蓝图上 before_app_first_request #只会在第一次请求执行,往后就不执行, (待定,此属性没调试通过) before_app_request # 每次请求都会执行一次(重点…

计网-All

路由器的功能与路由表的查看_路由器路由表_傻傻小猪哈哈的博客-CSDN博客路由基础-直连路由、静态路由与动态路由的概念_MikeVane-bb的博客-CSDN博客路由器的功能与路由表的查看_路由器路由表_傻傻小猪哈哈的博客-CSDN博客 直连路由就是路由器直接连了一个网段&#xff0c;他就…

【C++ 学习 ⑱】- 多态(上)

目录 一、多态的概念和虚函数 1.1 - 用基类指针指向派生类对象 1.2 - 虚函数和虚函数的重写 1.3 - 多态构成的条件 1.4 - 多态的应用场景 二、协变和如何析构派生类对象 2.1 - 协变 2.2 - 如何析构派生类对象 三、C11 的 override 和 final 关键字 一、多态的概念和虚…

微信扫码跳转微信小程序

一:首先声明为什么需要这样做 项目中需要在后台管理页面进行扫码支付,其他人弄了微信小程序支付,所以就需要挑战小程序进行支付,在跳转的时候需要参数例如订单编号等 二:跳转小程序的方法有多种 接口调用凭证 | 微信开放文档 具体可以参考微信开放文档 1.获取scheme码 按照文…

【项目实战典型案例】05.前后端分离的好处(发送调查问卷)

目录 一、背景二、思路三、过程1、主要的业务逻辑2、解决问题的思路 四、总结五、面向对象的好处 一、背景 以下流程图是给用户发送调查问的整体流程&#xff0c;将不必要的业务逻辑放到前端进行处理。这样导致逻辑混乱难以维护。前后端分离的其中一个目的是将功能的样式放在了…

基础论文学习(5)——MAE

MAE&#xff1a;Masked Autoencoders Are Scalable Vision Learners Self-Supervised Learning step1&#xff1a;先用无标签数据集&#xff0c;把参数从一张白纸训练到初步预训练模型&#xff0c;可以得到数据的 Visual Representationstep2&#xff1a;再从初步成型&#x…

clickhouse ssb-dbgen数据构造 及 clickhouse-benchmark简单压测

一、 测试数据构造 1. 数据样例 官方文档有给出一批数据样例。优点是比较真实&#xff0c;缺点是太大了&#xff0c;动辄上百G不适合简单小测试 Anonymized Yandex.Metrica DatasetStar Schema BenchmarkWikiStatTerabyte of Click Logs from CriteoAMPLab Big Data Benchma…

浅析Linux 物理内存外碎片化

本文出现的内核代码来自Linux4.19&#xff0c;如果有兴趣&#xff0c;读者可以配合代码阅读本文。 一、Linux物理内存外碎片化概述 什么是Linux物理内存碎片化&#xff1f;Linux物理内存碎片化包括两种&#xff1a; 1.物理内存内碎片&#xff1a;指分配给用户的内存空间中未…

【产品规划】优先级规划

文章目录 1、功能优先级保障了产品在最短时间接受验证2、隐藏在优先级背后的是产品的目标和价值3、敏捷方法论中的功能优先级制定方法4、优先级制定时常见问题和应对方法5、敏捷方法论中的开发计划制定 1、功能优先级保障了产品在最短时间接受验证 2、隐藏在优先级背后的是产品…

C++ list模拟实现

list模拟实现代码&#xff1a; namespace djx {template<class T>struct list_node{T _data;list_node<T>* _prev;list_node<T>* _next;list_node(const T& x T()):_data(x),_prev(nullptr),_next(nullptr){}};template<class T,class Ref,class Pt…

ctfshow-红包题第二弹

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 同样&#xff0c;先看一下有没有注释的内容&#xff0c;可以看到有一个cmd的入参 执行之后可以看到文件代码&#xff0c;可以看到也是eval&#xff0c;但是中间对大部分的字符串都进行了过滤&#xff0c;留下了…

纸贵科技连续三年蝉联IDC中国 FinTech 50榜单

近日&#xff0c;国际权威市场研究机构IDC公布了“2023 IDC中国FinTech 50榜单”。作为领先的区块链技术和解决方案服务商&#xff0c;纸贵科技凭借过硬的区块链技术和丰富的金融科技创新成果&#xff0c;连续第三年荣登IDC中国FinTech 50榜单。 IDC中国FinTech 50榜单是金融科…

【leetcode 力扣刷题】双指针///原地扩充线性表

双指针///原地扩充线性表 剑指 Offer 05. 替换空格定义一个新字符串扩充字符串&#xff0c;原地替换思考 剑指 Offer 05. 替换空格 题目链接&#xff1a;剑指 Offer 05. 替换空格 题目内容&#xff1a; 这是一道简单题&#xff0c;理解题意&#xff0c;就是将字符串s中的空格…

很干的 Nginx

&#x1f3a8; 前言 本篇文章有些概念性的东西&#xff0c;是结合自己的理解表达出来的&#xff0c;可能有些理解不到位的地方。希望多多指教&#xff0c;谢谢大家。 红包献上 &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;…

【c语言】文件操作 万字详解

目录 一&#xff0c;为什么使用文件 二&#xff0c;什么是文件 1&#xff0c;程序文件 2&#xff0c;数据文件 3&#xff0c;文件名 三&#xff0c;文件的打开和关闭 1&#xff0c;文件指针 2&#xff0c;文件的打开和关闭 四&#xff0c; 文件的顺序读写 1&#xff0c;顺序…

ethers.js2:provider提供商

1、Provider类 Provider类是对以太坊网络连接的抽象&#xff0c;为标准以太坊节点功能提供简洁、一致的接口。在ethers中&#xff0c;Provider不接触用户私钥&#xff0c;只能读取链上信息&#xff0c;不能写入&#xff0c;这一点比web3.js要安全。 除了之前介绍的默认提供者d…

如何编译打包OpenSSH 9.4并实现批量升级

1 介绍 openssh 9.4版本已于8月10号发布&#xff0c;安全团队又催着要赶紧升级环境里的ssh版本&#xff0c;本文主要介绍Centos5、Centos6、Centos7下openssh 9.4源码编译rpm包以及批量升级服务器openssh版本的方法。关注公众号后台回复ssh可获取本文相关源码文件。 https://w…

使用Tampermonkey(篡改猴)向页面注入js脚本

一、Tampermonkey 简单介绍 Tampermonkey是一款浏览器插件&#xff0c;适用于Chrome、Microsoft Edge、Safari、Opera Next 和 Firefox。他允许我们自定义javascript给指定网页添加功能&#xff0c;或修改现有功能。也可以用来辅助调试&#xff0c;或去除网页广告等。 官网地…

深度学习-4-二维目标检测-YOLOv3理论模型

单阶段目标检测模型YOLOv3 R-CNN系列算法需要先产生候选区域&#xff0c;再对候选区域做分类和位置坐标的预测&#xff0c;这类算法被称为两阶段目标检测算法。近几年&#xff0c;很多研究人员相继提出一系列单阶段的检测算法&#xff0c;只需要一个网络即可同时产生候选区域并…

Redis.conf详解

Redis.conf详解 配置文件unit单位对大小写不敏感 包含 网络 bind 127.0.0.1 # 绑定的ip protected-mode yes # 保护模式 port 6379 # 端口设置通用 GENERAL daemonize yes # 以守护进程的方式运行 默认为no pidfile /var/run/redis_6379.pid #如果以后台的方式运行&#xff…