利用Matlab绘制甘特图的方法详解

 更新时间:2022年10月23日 10:18:23   作者:slandarer  
这篇文章主要为大家详细介绍了如何利用Matlab实现甘特图(gantt chart)的绘制,文中的示例代码讲解详细,对我们学习Matlab有一定帮助,需要的可以参考一下

前言

好久不见哈,今天带来一个不咋炫酷但是比较实用的甘特图绘制,就画一堆矩形嘛非常简单。

工具函数完整代码

之所以这期工具函数放在最前面是因为比较短哈:

function ganttHdl=ganttChart(sT,dT,id,varargin)
% sT | 任务开始时间
% dT | 任务持续时间
% id | 任务所属类型

% @author : slandarer
% 公众号  : slandarer随笔
ax=gca;hold on;
ax.YTick=1:max(id);
ax.YLim=[0,max(id)+1];
sT=sT(:);dT=dT(:);id=id(:);

% 基本配色表
this.colorList=[118 160 173;89 124 139;212 185 130;
    217 189 195;165 108 127;188 176 210]./255;
this.colorList=[this.colorList;rand(max(id),3).*.6+.4];

% 获取其他属性
this.String='';
arginList={'String','ColorList'};
for i=(length(varargin)-1):-2:1
    tid=ismember(arginList,varargin{i});
    if any(tid)
        this.(arginList{tid})=varargin{i+1};
        varargin(i:i+1)=[];
    end
end


% 循环绘图
for i=unique(id)'
    t_sT=sT(id==i);
    t_dT=dT(id==i);
    [t_sT,t_ind]=sort(t_sT);
    t_dT=t_dT(t_ind);
    if ~isempty(this.String)
        t_Str=this.String(id==i);
        t_Str=t_Str(t_ind);
    end
    for j=1:length(t_sT)
        ganttHdl.(['p',num2str(i)])(j)=rectangle('Position',[t_sT(j),i-.4,t_dT(j),.8],...
            'LineWidth',.8,'EdgeColor',[.2,.2,.2],...
            'FaceColor',this.colorList(i,:),'AlignVertexCenters','on',varargin{:});
    end
    for j=1:length(t_sT)
        if ~isempty(this.String)
            ganttHdl.(['t',num2str(i)])(j)=text(t_sT(j),i,t_Str{j});
        else
            ganttHdl.(['t',num2str(i)])(j)=text(t_sT(j),i,'');
        end
    end
end
end

使用方法

基本使用

设置任务开始时间,结束时间及任务编号后,调用工具函数绘图即可:

startT=[0 3 5 12 16,1.5 6 8 15 18,3 10 11 16 19,2 4 11 13 15,1 3 7 16 18,5 11 14 16 20];
durationT=[3 2 5 4 4,4 1 7 2 5,6 1 4 3 2,1 6 2 2 9,2 3 4 2 5,5 3 1 2 8];
jobId=[1 1 1 1 1,2 2 2 2 2,3 3 3 3 3,4 4 4 4 4,5 5 5 5 5,6 6 6 6 6];

GTC=ganttChart(startT,durationT,jobId);

不咋好看的圆角

设置Curvature为0-1之间的数值即可:

GTC=ganttChart(startT,durationT,jobId,'Curvature',.8);

修改Y轴标签

就改当前坐标区域的YTickLabel属性即可,例如:

ax=gca;
ax.YTickLabel={'Process1','Process2','Process3','Process4','Process5','Process6'};

添加每个任务上的文本信息

调用工具函数的时候设置String属性即可,例如:

startT=[0 3 5 12 16,1.5 6 8 15 18,3 10 11 16 19,2 4 11 13 15,1 3 7 16 18,5 11 14 16 20];
durationT=[3 2 5 4 4,4 1 7 2 5,6 1 4 3 2,1 6 2 2 9,2 3 4 2 5,5 3 1 2 8];
jobId=[1 1 1 1 1,2 2 2 2 2,3 3 3 3 3,4 4 4 4 4,5 5 5 5 5,6 6 6 6 6];

pName{length(jobId)}='';
for i=1:length(jobId)
    pName(i)={num2str(i)};
end

GTC=ganttChart(startT,durationT,jobId,'String',pName);

当然可以更复杂些,包含一下每个任务的信息:

pName{length(jobId)}='';
for i=1:length(jobId)
    pName(i)={['[',num2str(startT(i)),',',num2str(startT(i)+durationT(i)),']']};
end

单独修改任务标签信息

实际上工具函数的返回值长这样:

GTC =
包含以下字段的 struct:
p1: [1×5 Rectangle]
t1: [1×5 Text]
p2: [1×5 Rectangle]
t2: [1×5 Text]
p3: [1×5 Rectangle]
t3: [1×5 Text]
p4: [1×5 Rectangle]
t4: [1×5 Text]
p5: [1×5 Rectangle]
t5: [1×5 Text]
p6: [1×5 Rectangle]
t6: [1×5 Text]

因此我们可以对每个矩形块或者每个文本单独修饰,例如:

startT=[0 3 5 12 16,1.5 6 8 15 18,3 10 11 16 19,2 4 11 13 15,1 3 7 16 18,5 11 14 16 20];
durationT=[3 2 5 4 4,4 1 7 2 5,6 1 4 3 2,1 6 2 2 9,2 3 4 2 5,5 3 1 2 8];
jobId=[1 1 1 1 1,2 2 2 2 2,3 3 3 3 3,4 4 4 4 4,5 5 5 5 5,6 6 6 6 6];


GTC=ganttChart(startT,durationT,jobId);

GTC.t1(2).String='slandarer';
GTC.t1(2).Color=[1,0,0];
GTC.t1(2).FontSize=25;

修改颜色

写个循环为每个矩形修改颜色,一个实例:

startT=[0 3 5 12 16,1.5 6 8 15 18,3 10 11 16 19,2 4 11 13 15,1 3 7 16 18,5 11 14 16 20];
durationT=[3 2 5 4 4,4 1 7 2 5,6 1 4 3 2,1 6 2 2 9,2 3 4 2 5,5 3 1 2 8];
jobId=[1 1 1 1 1,2 2 2 2 2,3 3 3 3 3,4 4 4 4 4,5 5 5 5 5,6 6 6 6 6];

GTC=ganttChart(startT,durationT,jobId);
colorList=[204,154,129;222,191,170;185,184,163;165,165,139;107,112,92]./255;

for i=1:max(jobId)
    tHdl=GTC.(['p',num2str(i)]);
    for j=1:length(tHdl)
        set(tHdl(j),'FaceColor',colorList(j,:))
    end
end

此处使用阿昆的科研日常 No.11配色

另一个实例:

startT=[0 3 5 12 16,1.5 6 8 15 18,3 10 11 16 19,2 4 11 13 15,1 3 7 16 18,5 11 14 16 20];
durationT=[3 2 5 4 4,4 1 7 2 5,6 1 4 3 2,1 6 2 2 9,2 3 4 2 5,5 3 1 2 8];
jobId=[1 1 1 1 1,2 2 2 2 2,3 3 3 3 3,4 4 4 4 4,5 5 5 5 5,6 6 6 6 6];

GTC=ganttChart(startT,durationT,jobId);
colorList=[165 108 127;165 108 127;89 124 139;
    89 124 139;212 185 130;212 185 130]./255;

for i=1:max(jobId)
    tHdl=GTC.(['p',num2str(i)]);
    for j=1:length(tHdl)
        set(tHdl(j),'FaceColor',colorList(i,:))
    end
end

ax=gca;
ax.YTickLabel={'S-1-1','S-1-2','S-2-1','S-2-2','S-3-1','S-3-2'};

实际上默认配色只有前六组是固定的,更多组是随机的,可以多画几组试试看:

startT=[0 3 5 12 16,1.5 6 8 15 18,3 10 11 16 19,2 4 11 13 15,1 3 7 16 18,5 11 14 16 20,0 3 5 12 16,1.5 6 8 15 18];
durationT=[3 2 5 4 4,4 1 7 2 5,6 1 4 3 2,1 6 2 2 9,2 3 4 2 5,5 3 1 2 8,3 2 5 4 4,4 1 7 2 5];
jobId=[1 1 1 1 1,2 2 2 2 2,3 3 3 3 3,4 4 4 4 4,5 5 5 5 5,6 6 6 6 6,7 7 7 7 7,8 8 8 8 8];


GTC=ganttChart(startT,durationT,jobId); 

以上就是利用Matlab绘制甘特图的方法详解的详细内容,更多关于Matlab绘制甘特图的资料请关注脚本之家其它相关文章!

相关文章

  • 70行C语言代码实现贪吃蛇

    70行C语言代码实现贪吃蛇

    这篇文章主要为大家详细介绍了70行C语言代码实现贪吃蛇,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 详解C语言中Char型指针数组与字符数组的区别

    详解C语言中Char型指针数组与字符数组的区别

    这篇文章主要介绍了详解C语言中Char型指针数组与字符数组的区别的相关资料,希望通过本文能帮助到大家掌握理解这部分内容,需要的朋友可以参考下
    2017-10-10
  • 使用C语言顺序表数据结构实现栈的代码示例

    使用C语言顺序表数据结构实现栈的代码示例

    这篇文章主要给大家介绍了如何使用C语言顺序表数据结构实现栈,文章通过代码示例介绍的非常详细,对大家的学习或工作有一定的参考价值,需要的朋友可以参考下
    2023-09-09
  • string与char*转换的使用详解

    string与char*转换的使用详解

    本篇文章对string与char*的转换进行的介绍。需要的朋友参考下
    2013-05-05
  • C语言中main函数与命令行参数详细讲解

    C语言中main函数与命令行参数详细讲解

    这篇文章主要为大家详细介绍了C语言main()函数与命令行参数问题,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-04-04
  • C++共享智能指针shared_ptr的实现

    C++共享智能指针shared_ptr的实现

    在C++中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露,解决这个问题最有效的方法是使用智能指针,本文主要介绍了C++共享智能指针shared_ptr的实现,感兴趣的可以了解一下
    2023-12-12
  • C++类的继承和派生及指针安全引用

    C++类的继承和派生及指针安全引用

    这篇文章主要介绍了C++类的继承和派生及指针安全引用,继承指从现有类获得其特性,派生指从已有类产生新的类,指针和引用并存,二者似乎有很多相同点,但是又不完全相同,下面关于两者的相关资料,需要的小伙伴可以参考一下
    2022-03-03
  • 理解C++编程中的std::function函数封装

    理解C++编程中的std::function函数封装

    这篇文章主要介绍了理解C++编程中的std::function函数封装,std::function是C++11标准中的新特性,需要的朋友可以参考下
    2016-04-04
  • C++11的for循环的新用法(推荐)

    C++11的for循环的新用法(推荐)

    C++11这次的更新带来了令很多C++程序员期待已久的for range循环,每次看到javascript, lua里的for range,心想要是C++能有多好,心里别提多酸了。这次C++11不负众望,再也不用羡慕别家人的for range了。下面看下C++11的for循环的新用法
    2021-11-11
  • C++ 迭代器失效问题解决

    C++ 迭代器失效问题解决

    在C++中,当一个vector进行了插入或删除操作时,其迭代器可能会失效,本文就来介绍一下C++ 迭代器失效问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01

最新评论