echarts绘制甘特图
在setoption之后添加这段代码:
window.addEventListener('resize', function () {
myChart.resize();
});
图表就能随着窗口大小,自动适应,且支持一页多图。
效果图:

html代码:
特别注意点:
xAxis : [
{
type : 'value',
splitNumber: legend.length-1,
max: legend.length-1,...
此处的splitNumber 和 max决定了x轴的分栏线是否重合(因为有上下两组数据,可能会出现分栏线不一致情况)
<! DOCTYPE html>
<html>
<head>
<title>报表</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<div id="charts_div" style="height: 550px;"></div>
<pre style="margin: -15px 0px 0px 20px;font-size: 14px;">
图例:<span style="display: inline-block;width: 20px;height: 10px; "></span>计划时长 <span style="display: inline-block;width: 20px;height: 10px; "></span>已完成阶段的实际时长 <span style="display: inline-block;width: 20px;height: 10px; "></span>未完成阶段的实际时长
</pre>
</body>
<script type="text/javascript" src="jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="dist/echarts.js"></script>
<script language="javascript">
require.config({
paths: {
echarts: 'dist'
}
});
function dateAfter(dateStr,num){
var date1 = new Date(Date.parse(dateStr.replace(/-/g, "/")));
//alert(date1.getFullYear()+"-"+(date1.getMonth()+1)+"-"+date1.getDate());
var date2 = new Date(date1);
date2.setDate(date1.getDate()+num);
var times = date2.getFullYear()+"-"+(date2.getMonth()+1)+"-"+date2.getDate();
return times;
}
function GetDateDiff(startDate,endDate){
var startTime = new Date(Date.parse(startDate.replace(/-/g, "/"))).getTime();
var endTime = new Date(Date.parse(endDate.replace(/-/g, "/"))).getTime();
var dates = (startTime - endTime)/(1000*60*60*24);
return dates;
}
//var url = "${path}/notice/groupFirstCheckNotice!initGantt.action?projectId=${resultjson.projectId}";
var totalCategory = 0,category=[],planData=[],planBase=[],actualData=[],actualBase=[],legend=[];
var globalmin = null;
var json = {
"currStageIndexList": [
8,
9
],
"currStageList": [
"初步验收",
"试运行"
],
"stageList": [
{
"planBeginDate": "2016-08-31",
"name": "设计审查",
"endDate": "2016-04-22",
"beginDate": "2016-04-22",
"planEndDate": "2016-10-05"
},
{
"planBeginDate": "2016-10-05",
"name": "设计批复",
"endDate": "2016-04-22",
"beginDate": "2016-04-22",
"planEndDate": "2016-10-12"
},
{
"planBeginDate": "2016-10-12",
"name": "工程交接",
"endDate": "2016-04-22",
"beginDate": "2016-04-22",
"planEndDate": "2016-10-26"
},
{
"planBeginDate": "2016-10-26",
"name": "设备到货验收",
"endDate": "2016-04-22",
"beginDate": "2016-04-22",
"planEndDate": "2016-11-25"
},
{
"planBeginDate": "2016-11-25",
"name": "开工启动",
"endDate": "2016-04-22",
"beginDate": "2016-04-22",
"planEndDate": "2016-12-25"
},
{
"planBeginDate": "2016-12-25",
"name": "设备安装",
"endDate": "2016-04-22",
"beginDate": "2016-04-22",
"planEndDate": "2017-01-01"
},
{
"planBeginDate": "2017-01-01",
"name": "系统调测",
"endDate": "2016-04-22",
"beginDate": "2016-04-22",
"planEndDate": "2017-01-08"
},
{
"planBeginDate": "2017-01-08",
"name": "割接上线",
"endDate": "2016-04-22",
"beginDate": "2016-04-22",
"planEndDate": "2017-01-15"
},
{
"planBeginDate": "2017-01-15",
"name": "初步验收",
"endDate": "2017-04-17",
"beginDate": "2017-01-22",
"planEndDate": "2017-04-15"
},
{
"planBeginDate": "2017-04-15",
"name": "试运行",
"endDate": "2017-11-17",
"beginDate": "2017-05-12",
"planEndDate": "2017-10-12"
},
{
"planBeginDate": "2017-10-12",
"name": "竣工验收",
"endDate": "",
"beginDate": "",
"planEndDate": "2017-12-11"
}
],
"projectId": 8211
}
//$.getJSON(url,function(json){
$(function(){
if(json && json.stageList){
totalCategory = json.stageList.length;
var minPlan = null, minActual = null, max = null;
for(var i=(totalCategory-1);i>=0;i--){
var planStart = json.stageList[i].planBeginDate;
var actualStart = json.stageList[i].beginDate;
if(i==(json.stageList.length-1)){
var dateTT = new Date();
var dstr = dateTT.getFullYear()+"-"+(dateTT.getMonth()+1)+"-"+dateTT.getDate()
minPlan = planStart || dstr;
minActual = actualStart || dstr;
max = planStart;
}
if(GetDateDiff(max,json.stageList[i].planEndDate)<0){
max = json.stageList[i].planEndDate;
}
if(GetDateDiff(max,json.stageList[i].endDate)<0){
max = json.stageList[i].endDate;
}
if(GetDateDiff(minPlan,planStart)>0){
minPlan = planStart;
}
if(GetDateDiff(minActual,actualStart)>0){
minActual = actualStart;
}
}
var min = null;
if(GetDateDiff(minPlan,minActual)>=0){
min = minActual;
}else{
min = minPlan;
}
globalmin = min;
for(var i=(totalCategory-1);i>=0;i--){
var planStart = json.stageList[i].planBeginDate;
var planEnd = json.stageList[i].planEndDate;
var actualStart = json.stageList[i].beginDate;
var actualEnd = json.stageList[i].endDate;
category.push(json.stageList[i].name);
planBase.push(GetDateDiff(planStart,globalmin));
var pd = {};
pd.value = GetDateDiff(actualEnd,actualStart);
pd.color = '#FF0000';
var currentStage = json.currStageList;
var sName = json.stageList[i].name;
if(currentStage && $.inArray(sName, currentStage)>-1){
pd.color = '#FFFF00';
}
planData.push(GetDateDiff(planEnd,planStart));
actualBase.push(GetDateDiff(actualStart,globalmin));
actualData.push(pd);
}
for(var i=0;i<GetDateDiff(max,min);i++){
var dt = dateAfter(min,i);
legend.push(dt);
}
init();
}
});
function init(){
require(
[
'echarts',
'echarts/chart/bar'
],
//自建项目饼状图设置
function (ec) {
var myChart = ec.init(document.getElementById('charts_div'));
var option = {
title: {
text: '',
subtext: ''
},
tooltip : {
trigger: 'axis',
axisPointer : { // 坐标轴指示器,坐标轴触发有效
type : 'shadow' // 默认为直线,可选为:'line' | 'shadow'
},
formatter: function (params) {
var tar0 = params[0];
var tar1 = params[1];
var tar2 = params[2]
var tar3 = params[3];
var result = tar2.seriesName + ' : ' + dateAfter(globalmin,tar2.value-0) + '<br/>' +
tar3.seriesName + ' : ' + dateAfter(globalmin,tar2.value+tar3.value)+ '<br/>' +
tar0.seriesName + ' : ' + dateAfter(globalmin,tar0.value-0) + '<br/>' +
tar1.seriesName + ' : ' + dateAfter(globalmin,tar0.value+tar1.value);
return result;
}
},
xAxis : [
{
type : 'value',
splitNumber: legend.length-1,
max: legend.length-1,
axisLabel:{
show: false
},
splitLine:{
show: false
}
},
{
type : 'category',
boundaryGap : false,
data : legend
}
],
yAxis : [
{
type : 'category',
splitLine: {show:false},
data : category
}
],
series : [
{
name:'实际开始时间',
type:'bar',
stack: '总量1',
itemStyle:{
normal:{
barBorderColor:'rgba(0,0,0,0)',
color:'rgba(0,0,0,0)'
},
emphasis:{
barBorderColor:'rgba(0,0,0,0)',
color:'rgba(0,0,0,0)'
}
},
data:actualBase
},
{
name:'实际完成时间',
type:'bar',
stack: '总量1',
itemStyle : { normal: {
color:function(params) {
//alert(JSON.stringify(params));
return params.data.color;
},label : {show: true, position: 'inside'}}},
data:actualData
},
{
name:'计划开始时间',
type:'bar',
stack: '总量',
itemStyle:{
normal:{
barBorderColor:'rgba(0,0,0,0)',
color:'rgba(0,0,0,0)'
},
emphasis:{
barBorderColor:'rgba(0,0,0,0)',
color:'rgba(0,0,0,0)'
}
},
data:planBase
},
{
name:'计划完成时间',
type:'bar',
stack: '总量',
itemStyle : {
normal: {
color:'#00AA55',
label : {
show: true,
position: 'inside'
}
}
},
data:planData
}
]
};
myChart.setOption(option);
}
);
}
</script>
</html>
echarts绘制甘特图的更多相关文章
- 使用Excel 2007绘制甘特图
本文将教大家如何使用Excel 2007制作甘特图.Excel并未提供甘特图类型,但还是可以绘制甘特图的,方法就是通过对堆积条形图类型进行自定义,使之显示任务.任务工期和层次结构. 下面的过程可帮助创 ...
- Python使用Plotly绘图工具,绘制甘特图
今天来讲一下如何使用Python 的绘图工具Plotly来绘制甘特图的方法 甘特图大家应该了解熟悉,就是通过条形来显示项目的进度.时间安排等相关情况的. 我们今天来学习一下,如何使用ployly来绘制 ...
- 如何使用Excel绘制甘特图
摘自:http://www.mifengtd.cn/articles/how-to-create-a-gantt-chart-in-excel.html 再造<优秀的时间管理和项目管理工具> ...
- 基于 ECharts 封装甘特图并实现自动滚屏
项目中需要用到甘特图组件,之前的图表一直基于 EChart 开发,但 EChart 本身没有甘特图组件,需要自行封装 经过一番鏖战,终于完成了... 我在工程中参考 v-chart 封装了一套图表组件 ...
- python的matplotlib.pyplot绘制甘特图
博主本来就想简单地找一下代码,画一幅甘特图,结果百度之后发现甘特图的代码基本都不是用matplotlib库,但是像柱状图等统计图通常都是用这个库进行绘制的,所以博主就花了一些时间,自己敲了一份代码,简 ...
- 第二阶段:1.流程图:9.excel绘制甘特图
后面的框都是日期 可以以一个月为周期计算或者周或者... 因为产品经理应该严格把控产品的时间 因此甘特图特别有必要 注意:任务拆解的越细 把控度越强 然后对格式进行设置 注意时间下面可以用颜色填充来表 ...
- 前端 | 使用 ECharts 绘制关系图
0 需求 做的项目需要画一个关系图,主要需求如下: 需要展示6种对象之间的关系:数据机构 数据 合约 模型 计算机构 应用 支持突出显示6种对象中的某一种的所有对象 支持Top x子图功能.top x ...
- ECharts绘制折线图
首先看实现好的页面 实现 首先引入echarts工具 // vue文件中引入echarts工具 let echarts = require('echarts/lib/echarts') require ...
- qt绘制甘特图
重写paintEvent事件,代码如下 void xx::paintEvent(QPaintEvent *event){ QPainter painter(this); //绘制x,y轴,_maxWi ...
随机推荐
- java的继承和重写
继承是面向对象最显著的一个特性.继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.[1] Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以 ...
- flume log4j配置
版权声明:本文为博主原创文章,未经博主允许不得转载. 1.依赖jar包导入,通过maven管理,pom文件增加如下配置: <!-- log4j输出日志到flume的appender依赖包 --& ...
- Hibernate一对一外键双向关联(Annotation配置)
如上图所示:一个学生有一个学生证号,一个学生证号对应一名学生.在Hibernate中怎么用Annotation来实现呢? 学生类,主键是id:学生证的主键也是Id: Student.java pack ...
- DUBBO参数验证
public class ValidationParameter implements Serializable { private static final long seria ...
- [转载]我的WCF之旅(1):创建一个简单的WCF程序
为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一个完整的WCF应用.本应用功能虽然简单,但它涵盖了一个完整WCF应用的基本结构.对那些对WCF不是很了解的读者来说,这个例 ...
- 配置移动前端开发调试环境(nodejs+npm+weiner的安装和配置使用)
这段时间发现做移动端的开发调试是一大难题,网上逛了逛发现有一些工具可用,如chrome的远程调试,实际测试过程中我始终调试不成功,听说被墙后是不行的,所以最终找了如下的方法. 因为基于nodeJS环境 ...
- 非正常关闭myeclicps后,出现错误Errors occurred during the build.的解决方法
我的myeclicps是10.7版本由于非正常关闭,在启动tomcat时候出现了问题. 解决法案: 1.关闭myeclicps. 2.打开你的myeclicps的工作空间(workspace自己设置的 ...
- loadrunner ---模拟多IP登录
1.打开HP LoadRunner ->Tools ->IP Wizard
- go 静态web服务器
package main import ( "net/http" ) type helloHandler struct{} func (h *helloHandler) Serve ...
- nullcon HackIM 2016 -- Crypto Question 5
Now you are one step away from knowing who is that WARRIOR. The Fighter who will decide the fate of ...