echarts 自定义甘特图
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 自定义甘特图相关推荐
- echart 时间滚动_基于 ECharts 封装甘特图并实现自动滚屏
项目中需要用到甘特图组件,之前的图表一直基于 EChart 开发,但 EChart 本身没有甘特图组件,需要自行封装 经过一番鏖战,终于完成了... 我在工程中参考 v-chart 封装了一套图表组件 ...
- echarts gantt甘特图示例
甘特图(Gantt chart)又称为横道图.条状图(Bar chart).其通过条状图来显示项目.进度和其他时间相关的系统进展的内在关系随着时间进展的情况.以提出者亨利·劳伦斯·甘特(Henry L ...
- Echarts之甘特图type: ‘custom‘参数详解
甘特图 const groupData = XEUtils.groupBy(data, "eqpName"); //分组后的数据 const yAxisData = Object. ...
- echarts实现甘特图
效果如下图:y轴为餐桌编号,x轴为客人预订的时间: 以8号餐桌为例,甘特数据为阴影部分,表示不同时间段客人用餐占用的时间.如果时间段有交集则说明有时间冲突,应做时间调整. vue 部分代码: < ...
- vue+echarts画甘特图
vue项目中添加echarts,只需要增加echarts依赖,然后在main.js中引入echarts就可以使用了. 1.npm install echarts --save 2.修改main.js ...
- Qt 使用 kdChart 自定义甘特图
但是和项目设计有点出入,所以自定义部分显示: 1.左边的是QTreeView,并为其添加委托,控件变化主要是通过QStandardItem->setData()来区别,这没什么说的,主要记录修改 ...
- echarts 柱状图 甘特图
option = { title: { text: "一天分布", subtext: "纯属虚构", }, tooltip: { trigger: " ...
- echarts自定义雷达图(radar)
先来个效果图 1.首先设置形状 shape: "circle", // 支持 'polygon' 和 'circle' ,默认polygon 2.设置线条 splitLine: { ...
- html 绘制甘特图,echarts绘制甘特图
在setoption之后添加这段代码:window.addEventListener('resize', function () { myChart.resize(); }); 图表就能随着窗口大小, ...
- echarts实现甘特图(项目进度/任务进度)
1.先看效果图: 2.代码部分我只贴出来option部分,其余的都是一样的:也可参考官网地址: https://www.echartsjs.com/examples/zh/index.html#cha ...
最新文章
- python3多进程 queue 取值_【整理】python多进程之间共享queue | 勤奋的小青蛙
- Linux提权:常用三种方法
- 计算机组成原理——关于数据对齐存储
- JNI开发笔记(八)--Java读取txt文件进行JNI测试
- linux malloc core,Linux上使用的malloc版本
- 螺旋矩阵 详解(C++)
- 【Linux】ubuntu锐捷客户端连接四川大学校园网
- python读取csv数据出错_使用Pandas在python中读取csv文件时出错
- ANSYS 有限元分析 概述
- springboot xml转json工具类
- oracle分组拼接
- DirectX12(D3D12)基础教程(十)——DXR(DirectX Raytracing)基础教程(上)
- 安全检查未通过_QQ群文件未通过安全检查,禁止下载该文件解决办法(QQ收藏)
- 应对微软黑屏的解决办法
- 【初学者入门C语言】之习题篇(一)
- 阿波罗java_携程Apollo(阿波罗)安装部署以及java整合实现
- rsa java模数_公钥/私钥中的RSA密钥值和模数
- rhel6 中安装使用finger命令
- Android Studio 3.6 发布啦,快来围观
- mysql中dist_在SQL语句中dist是什么意思