echarts 自定义甘特图

  • 效果
  • 思路
  • 实现
    • 先来看ganttItem的实现![在这里插入图片描述](https://img-blog.csdnimg.cn/63c1e30729ea4c2288bc693716acd3f7.png)
    • 数组对象分组处理
    • y轴自定义的实现就相对简单些
  • 总结

效果


echarts 官网实例

思路

官网展示的甘特图,其实也是通过自定义type: 'custom'实现的。

1.grid,xAxis,yAxis属性可以根据你的业务需求进行样式调整。
2.tooltip,是可选的主要控制的是甘特图鼠标hover的提示文字。
3.series是核心代码。

实现

核心代码如下

      series: [{id: 'flightData',type: 'custom',renderItem: (params:any, api:any)=>{// seriesData 是每个甘特图段的数据值console.log(seriesData,'seriesData')let color = api.value(DIM_TIME_TASK) === currentTask ? currentColor : 'grey'// color 是根据我的业务需求进行的,单行甘特段颜色设置var categoryIndex = api.value(DIM_CATEGORY_INDEX);var timeArrival = api.coord([api.value(DIM_TIME_ARRIVAL), categoryIndex]); //单个段落起始值var timeDeparture = api.coord([api.value(DIM_TIME_DEPARTURE), categoryIndex]);//单个段落结束值var barLength = timeDeparture[0] - timeArrival[0] || 50;var barHeight = api.size([0, 1])[1] * HEIGHT_RATIO;var x = timeArrival[0];var y = timeArrival[1] - barHeight;var rectNormal = this.clipRectByRect(params, {x: x,y: y,width: barLength,height: barHeight,});console.log(rectNormal,'rectNormal')return {type: 'group',children: [{type: 'rect',shape: rectNormal,style: api.style({                                 fill: color,textFill: '#fff',text:aliasValue ? api.value(DIM_TIME_AlIAS)  + '' : api.value(DIM_TIME_TASK) + ''})},]};},encode: {x: [DIM_TIME_ARRIVAL, DIM_TIME_DEPARTURE],y: DIM_CATEGORY_INDEX,tooltip: [aliasValue ? DIM_TIME_AlIAS : DIM_TIME_TASK, DIM_TIME_ARRIVAL , DIM_TIME_DEPARTURE]  //此处控制tooltip展示的值},data:seriesData},{type: 'custom',renderItem: (params:any,api:any)=>{var interval = api.size([0,1])[1]var newY = api.coord([0, api.value(0)])[1];if (newY < params.coordSys.y + 5) {return;}return {type: 'group',position: [60, newY - interval/2 ],children: [{type: 'text',style: {text:arrDataY[api.value(0)],textAlign: 'center',textFill: colorY,}}]};},encode: {x: -1,y: 0},data: arrDataY.map((it:any,i:number)=>i)}]

先来看ganttItem的实现

请仔细看seriseData的值,会发现下标为0,1名字都是demo,最后一项都是0,6,7都是demo14,最后一项都是5,那是因为是我将后台返回的数据进行了进行分组(分组方法下面会讲到)。

同时会按照分组后,为其添加下标,官网数据也是如此的,。

也就是说,如果想让甘特图一行显示多块儿,就要满足这两个数组会有同样的值(注意:这个值必须是数字,在canvas绘制并且会根据你的这个值进行排序绘画),这也就是为什么我的demo会显示在最下面第一行。

细心的同学也就会发现renderItem 其实是循环处理的seriesData,如上图我打印的4,0,1分别就对应了排序下标,开始时间,结束时间。

简而言之:就是将data数据组成 [ [单个甘特段开始值,单个甘特段结束值,当前甘特行在哪行显示的下标] ],其余的都可以不要

数组对象分组处理

export const getSeriesData = (arr:Array<any>,taskVal:string)=>{// arr 原始数据  taskVal 根据哪个字段进行分组 我是根据 task进行的分组let arrData:any = [];console.log(arr,'原始数据 两笔数据')// 第一步 query 数据整合arr.forEach((item:any)=>{let fieldList:any = []item.fields.forEach((it:any) => {fieldList.push({name:it.name,value:it.values.buffer})});     const fieldData = getFieldData(fieldList)arrData = arrData.concat(fieldData.newArr);})console.log(arrData,'将两笔数据进行整合')// 第二部 根据task进行分组处理var taskRather:any = []var taskArr:any = []for(let i = 0 ; i < arrData.length ; i ++){const arrDataInfo = arrData[i];if(!taskRather.find((it:string)=>it === arrDataInfo[taskVal])){// 不重复tasktaskArr.push({task:arrDataInfo[taskVal],children:[arrDataInfo]})taskRather.push(arrDataInfo[taskVal])}else{// 重复的taskfor(let j = 0 ; j < taskArr.length ; j ++){const taskInfo = taskArr[j];if(arrDataInfo[taskVal] === taskInfo.task){taskInfo.children.push(arrDataInfo)}}}}console.log(taskArr,'分组后的数据')// 第三步生成对应的index,用于在panel显示 tips:必须判断children长度,进行newData添加let newData:any = [ ]for(let i = 0 ; i < taskArr.length ; i ++ ){const taskInfo = taskArr[i];if(taskInfo.children.length > 1){for(let j = 0 ; j < taskInfo.children.length; j ++){const data = taskInfo.children[j]data.group = inewData.push(Object.values(data))}}else{for(let j = 0 ; j < taskInfo.children.length; j ++){const data = taskInfo.children[j]data.group = inewData.push(Object.values(data))}}}console.log(newData,'最后组成的符合echarts的数据')return {arrData:newData,}
}
export const getFieldData = (arr:Array<any>)=>{let newArr:any = [];for(let i = 0 ; i < arr[0].value.length ; i ++){let obj:any = {}for(let j = 0 ; j < arr.length ; j ++){obj[arr[j].name] = arr[j].value[i]}newArr.push(obj)}return {newArr}}

运行结果如下

y轴自定义的实现就相对简单些


arrDataY 就对应了每行的名字,data取下标就变成了[0,1,2,3,4,5]。

有个注意点是position: [60, newY - interval/2 ], 我对interval/2这样y轴的文字就会显示在每行的中间位置上,不/2就会在每行x轴显示。

yAxis的max属性 换成rrDataY.length 即可

    yAxis: {axisTick: { show: false },splitLine: { show: false},axisLine: { show: true },axisLabel: { show: true },min: 0,max:arrDataY.length},

总结

其实甘特图整个不是特别复杂,只需要组成echarts符合的数据就好,官网的功能更复杂所以看起来很复杂。

为方便理解:可以将下面testData进行替换GanttItem中的data值,就会很明显的理解了

const testData = [['0',1496840400000,  //2017-6-7 21:0:01496934000000,  //2017-6-8 23:0:0],['1',1496924700000,  //2017-6-8 20:25:01496934000000, //2017-6-8 23:0:0],['1',1496840400000,  //2017-6-7 21:0:01496878800000,  //2017-6-8 7:40:0],['2',1496916600000,  //2017-6-8 18:10:01496934000000,//2017-6-8 23:0:0]
]

echarts 自定义甘特图相关推荐

  1. echart 时间滚动_基于 ECharts 封装甘特图并实现自动滚屏

    项目中需要用到甘特图组件,之前的图表一直基于 EChart 开发,但 EChart 本身没有甘特图组件,需要自行封装 经过一番鏖战,终于完成了... 我在工程中参考 v-chart 封装了一套图表组件 ...

  2. echarts gantt甘特图示例

    甘特图(Gantt chart)又称为横道图.条状图(Bar chart).其通过条状图来显示项目.进度和其他时间相关的系统进展的内在关系随着时间进展的情况.以提出者亨利·劳伦斯·甘特(Henry L ...

  3. Echarts之甘特图type: ‘custom‘参数详解

    甘特图 const groupData = XEUtils.groupBy(data, "eqpName"); //分组后的数据 const yAxisData = Object. ...

  4. echarts实现甘特图

    效果如下图:y轴为餐桌编号,x轴为客人预订的时间: 以8号餐桌为例,甘特数据为阴影部分,表示不同时间段客人用餐占用的时间.如果时间段有交集则说明有时间冲突,应做时间调整. vue 部分代码: < ...

  5. vue+echarts画甘特图

    vue项目中添加echarts,只需要增加echarts依赖,然后在main.js中引入echarts就可以使用了. 1.npm install echarts --save 2.修改main.js ...

  6. Qt 使用 kdChart 自定义甘特图

    但是和项目设计有点出入,所以自定义部分显示: 1.左边的是QTreeView,并为其添加委托,控件变化主要是通过QStandardItem->setData()来区别,这没什么说的,主要记录修改 ...

  7. echarts 柱状图 甘特图

    option = { title: { text: "一天分布", subtext: "纯属虚构", }, tooltip: { trigger: " ...

  8. echarts自定义雷达图(radar)

    先来个效果图 1.首先设置形状 shape: "circle", // 支持 'polygon' 和 'circle' ,默认polygon 2.设置线条 splitLine: { ...

  9. html 绘制甘特图,echarts绘制甘特图

    在setoption之后添加这段代码:window.addEventListener('resize', function () { myChart.resize(); }); 图表就能随着窗口大小, ...

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

    1.先看效果图: 2.代码部分我只贴出来option部分,其余的都是一样的:也可参考官网地址: https://www.echartsjs.com/examples/zh/index.html#cha ...

最新文章

  1. python3多进程 queue 取值_【整理】python多进程之间共享queue | 勤奋的小青蛙
  2. Linux提权:常用三种方法
  3. 计算机组成原理——关于数据对齐存储
  4. JNI开发笔记(八)--Java读取txt文件进行JNI测试
  5. linux malloc core,Linux上使用的malloc版本
  6. 螺旋矩阵 详解(C++)
  7. 【Linux】ubuntu锐捷客户端连接四川大学校园网
  8. python读取csv数据出错_使用Pandas在python中读取csv文件时出错
  9. ANSYS 有限元分析 概述
  10. springboot xml转json工具类
  11. oracle分组拼接
  12. DirectX12(D3D12)基础教程(十)——DXR(DirectX Raytracing)基础教程(上)
  13. 安全检查未通过_QQ群文件未通过安全检查,禁止下载该文件解决办法(QQ收藏)
  14. 应对微软黑屏的解决办法
  15. 【初学者入门C语言】之习题篇(一)
  16. 阿波罗java_携程Apollo(阿波罗)安装部署以及java整合实现
  17. rsa java模数_公钥/私钥中的RSA密钥值和模数
  18. rhel6 中安装使用finger命令
  19. Android Studio 3.6 发布啦,快来围观
  20. mysql中dist_在SQL语句中dist是什么意思

热门文章

  1. (二)XGBoost之DART booster
  2. python计算md5码
  3. 存储基础知识学习(12月)
  4. python计算加权平均分_Python计算加权平均分的问题?大神求解答。。。。。
  5. 读书感受 之 《三体》
  6. 狂神SpringBoot静态资源文件
  7. 计算机网络计费系统是什么意思,计费系统
  8. 交换机设置环路导致网络瘫痪
  9. 如何离线加载全国2.48TB天地图
  10. 微信小程序,Python爬虫抓包采集实战,采集某成考题库小程序