echarts甘特图 一个值多条线

这篇具有很好参考价值的文章主要介绍了echarts甘特图 一个值多条线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 先看图

echarts甘特图 一个值多条线,echarts,甘特图,javascript

这里我们用到的是 series :type:custom  自定义,但是这里我遇到一个问题,就是不过你在series里push多少数据,图表上显示的都是在同一水平线,用了好多方法都不好使,

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' 等等。
                    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(),
                };
            },

图: 重叠在一起 ,

echarts甘特图 一个值多条线,echarts,甘特图,javascript

 最后用了最后使用了里面renderItem 返回的 y轴定位解决的(有好的方法可以和我说)。

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:10,
                    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(),
                };
            },

全部代码文章来源地址https://www.toymoban.com/news/detail-645892.html

<template>
    <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",
];
let showData = [
    [
        {
            value: [0, "2021-07-19 03:29:19", "2021-07-19 08:38:50", 0],
        },
        {
            value: [0, "2021-07-19 20:53:07", "2021-07-19 21:00:08", 1],
        },
    ],
    [
        {
            value: [0, "2021-07-19 00:00:00", "2021-07-19 00:08:02", 0],
        },
        {
            value: [0, "2021-07-19 01:38:37", "2021-07-19 01:50:08", 1],
        },

        {
            value: [0, "2021-07-19 22:31:30", "2021-07-19 22:44:13", 2],
        },
        {
            value: [1, "2021-07-19 20:53:07", "2021-07-19 11:00:08", 0],
        },

        {
            value: [1, "2021-07-19 22:31:30", "2021-07-19 22:44:13", 0],
        },
    ],
    [
        {
            value: [0, "2021-07-19 03:21:54", "2021-07-19 03:33:30", 0],
        },
        {
            value: [0, "2021-07-19 05:03:56", "2021-07-19 05:17:26", 1],
        },
        {
            value: [0, "2021-07-19 06:45:45", "2021-07-19 06:59:49", 2],
        },
        {
            value: [1, "2021-07-19 06:53:07", "2021-07-19 11:00:08", 0],
        },
        {
            value: [1, "2021-07-19 12:00:30", "2021-07-19 14:44:13", 1],
        },
    ],
];

// 分配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 + 15;
            return;
        }
        if (index % 2 == 0) {
            series.push(configSeriec(val, index, step));
            step = step + 15;
        } else {
            series.push(configSeriec(val, index, -step));
            step = step + 15;
        }
    });

    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 = {
    title: {
        text: "我是标题",
        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: ["图例", "图例2"],
    },
    dataZoom: [
        {
            show: true,
            realtime: true,
            start: 0,
            end: 100,
            xAxisIndex: [0, 1],
        },
        {
            type: "inside",
            realtime: true,
            start: 30,
            end: 70,
            xAxisIndex: [0, 1],
        },
    ],
    series: produceSeries(showData),
};

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

到了这里,关于echarts甘特图 一个值多条线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MYSQL: sql中某一个字段内容为用逗号分割的字符串转换成多条数据(适用于部分树机构)

    1.创建表的示例 数据如下图: SELECT a.id,SUBSTRING_INDEX(SUBSTRING_INDEX(a.userName,‘,’,b.help_topic_id+1),‘,’,-1) as name from tbl_name a left join mysql.help_topic b on b.help_topic_id (LENGTH(a.userName)-LENGTH(REPLACE(a.userName,‘,’,‘’))+1) ORDER BY a.id; 本人需求为 图层树的父级节点都在 ancestors 字段中,需要获取

    2024年02月11日
    浏览(57)
  • echarts实现一个3d效果柱形图

    思路是: 通过数组循环生成多个echarts实例盒子,生成的柱形图只有一条数据,是由多个图表设置 barGap: \\\'-100%\\\' 实现重叠,并通过设置柱形图中间颜色到边上颜色的渐变形成类似3d的视觉效果,实际每一个柱形图是由以下几个图表实现的:⛽️ 内层背景的body(bar) 内层背景的

    2024年02月15日
    浏览(36)
  • 封装了一个echarts图全屏放大的功能

    注意:1、没有监听屏幕的大小,我感觉没必要 2、如果是监听屏幕大小变化,直接echarts.resize()就行了。 1、initEcharts接收三个参数,参一为echarts渲染的目标元素 参二为echarts渲染的配置项 参三控制是否需要全屏放大的相关功能 2、screenFull 为控制某个元素放大的按钮,传递需要

    2023年04月25日
    浏览(26)
  • 封装一个公用的【Echarts图表组件】的3种模板

    1、模板1:vue2+javascript 2、模板2:vue3+javascript vue3中,有的图表调用不到,初始化echarts时使用 shallowRef 3、模板3:vue3+typescript 1、vue2 2、vue3+js 3、vue3+ts 1、鼠标单击/左键事件 2、鼠标移入/进入事件 3、鼠标移出/离开事件 4、让图表跟随屏幕去自适应 5、轮播动画效果 需要配置

    2024年02月03日
    浏览(31)
  • Flask配合Echarts写一个动态可视化大屏

    ch 后端:flask 可视化:echarts 前端:HTML+JavaScript+css 大屏拆分 案例项目中大屏可按版块进行拆解,会发现这里大屏主要由标题、折线图、柱状图、地图、滚动图和词云等组成,整体可切分为8个版块,如下: 下方为简单演示: HTML 我们整体布局前,先通过简单的案例了解前端布

    2024年02月07日
    浏览(37)
  • 如何在echarts的3d地球上以任意一个坐标点为圆心画一个标准的圆形(附代码)

    这是我用echarts做前端开发遇到的问题,似乎echarts没有提供在3d地球坐标面上画圆的方法。  而我的需求是要在地球上画出一个卫星通信的覆盖范围的圆形区域。  (效果展示) 最开始的时候我用网上的公式将经纬度乘系数转化为千米之后直接计算采样半径,然后在圆周中采

    2024年02月03日
    浏览(30)
  • vue3 甘特图(二):甘特图时间轴切换

    点击不同按钮,切换时间轴状态 2.1 配置时间轴参数 levels里可配置多个级别。 scales展示时间轴对应多少行,下的format可自定展现方式,css属性方法可判断是否为轴,给周末添加上高亮属性。     2.2 初始化时间轴配置 2.3 改变时间轴 2.4 周末或特殊日期高亮 见:vue3 甘特图(一

    2024年02月10日
    浏览(25)
  • 高级JavaScript。如何用JavaScript手撸一个富文本编辑器?

    要素过多建议收藏 基本的技术就是在空白 HTML 文件中嵌入一个 iframe 。通过 designMode 属性,可以将这个空白文档变成可以编辑的,实际编辑的则是 body 元素 的 HTML 。 designMode 属性有两个可能的值: \\\"off\\\" (默认值)和 \\\"on\\\" 。设置为 \\\"on\\\" 时,整个文档 都会变成可以编辑的(显示

    2024年01月21日
    浏览(40)
  • 甘特图是什么?利用甘特图来优化项目管理流程

    在现代项目管理中,图表是一种强大而直观的工具,可以帮助项目经理和团队成员清晰地了解并掌控整个项目进程。其中,甘特图是最常用和最有效的图表之一。 甘特图是一种条形图,可以用来直观地展示项目中各个任务的进度、持续时间和相互关系。它由一个横轴和一个纵轴组

    2024年04月28日
    浏览(28)
  • 用JavaScript做一个拼图游戏

    喜欢的可以复制下面完整代码查看效果在自己本地查看效果 实现难度:不算大,毕竟是小游戏 开发工具: html,css,js,jquery 新增严谨模式判定(2023.06.04) 非严谨判定:数字按顺序排即可 例:1,2,3,【空卡槽】,4,5,6,7,8 严谨判定:数字按顺序排,且空卡槽必须在最

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包