好久不见哈,今天带来一个不咋炫酷但是比较实用的甘特图绘制,就画一堆矩形嘛非常简单。
工具函数完整代码
之所以这期工具函数放在最前面是因为比较短哈:
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);
转载:https://blog.csdn.net/slandarer/article/details/127469719
查看评论