说明:
直接运行main.m即可画出甘特图,横轴为时间轴,纵轴为机器编号
每个方块中依次为:工件编号 工序编号 任务开始时刻 任务完成时刻
ps:1. 数据为模拟,不符合实际
2. 如果横轴和纵轴名称为中文,出现无法显示的问题,见“补充说明”
3. 任务调度的甘特图代码可见另一篇博文
运行效果:
main.m代码
ganttData = {
% 第一行表示 任务开始时间
[10 120 205 320 400 10 70 150 230 295 400 510 60 170 250 330 410 490 30 130 230 310 380 480 20 110 220 260 380 460;]
% 第二行表示 任务结束时间
[80 185 265 380 470 60 120 200 250 390 500 550 120 200 290 360 475 560 100 200 300 360 460 540 80 200 240 340 420 520;]
% 第三行表示 执行该任务的机器编号
[1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 ;]
% 第四行表示 工件编号
[1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 ;]
% 第五行表示 工件的工序
[1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5 ;]
};
% 以第一列为例, 表示1号工件的1号工序在机器1上执行,开始执行时间为10,结束执行时间为80
% 画图,'Time','Machine'分别为横轴和纵轴名称
GTC=ganttChart(ganttData,'Time','Machine');
ganttChart.m代码
function ganttHdl=ganttChart(ganttData,xLabelName,YLabelName)
% sT | 任务开始时间
% eT | 任务结束时间
% machineId | 任务所属机器编号
% taskId | 任务编号
hold on;
% 数据预处理
sT = ganttData{1, :};
eT = ganttData{2, :};
machineId = ganttData{3, :};
taskId = ganttData{4, :};
processId = ganttData{5, :};
display(taskId)
% 根据任务开始时间和结束时间计算 任务的持续时长
for ii=1:1:size(sT,2)
dT(ii)=eT(ii)-sT(ii);
end
% 获取甘特图每个方块中的数据
rectangleData{length(machineId)}='';
for i=1:length(machineId)
rectangleData(i)={[num2str(taskId(i)),' ',num2str(processId(i)),' ',num2str(sT(i)),' ',num2str(eT(i))]};
end
% 将 Y 轴刻度设置为从 1 到 max(id) 的整数
set(gca,'YTick',1:max(machineId));
% 将 Y 轴限制设置为从 0 到 max(id)+1
set(gca,'YLim',[0,max(machineId)+1]);
% 关闭X轴网格,开启需设置为 on
set(gca,'XGrid','off');
% 关闭Y轴网格,开启需设置为 on
set(gca,'YGrid','off');
% 设置网格线透明度,网格线关闭时不起作用
set(gca,'GridAlpha',0.5);
% 设置网格线颜色,网格线关闭时不起作用
set(gca,'GridColor',[0.5 0.5 0.5]);
% 设置背景色为白色
set(gcf,'color','w');
% 设置字体,包括大小,字体,线宽
set(gca,'FontSize',20,'fontname','Times New Roman','Linewidth', 1.2);
sT=sT(:);dT=dT(:);machineId=machineId(:);
box('on');
% 设置x和y轴 名称
xlabel(xLabelName);
ylabel(YLabelName);
% 颜色列表
colorList = [
255, 182, 193; % 浅粉红
173, 216, 230; % 淡蓝色
144, 238, 144; % 淡绿色
255, 228, 181; % 淡黄色
255, 248, 220; % 淡紫色
224, 255, 255; % 淡青色
255, 192, 203; % 淡粉红
240, 128, 128; % 淡珊瑚
152, 251, 152; % 淡绿宝石
255, 160, 122; % 淡珊瑚
221, 160, 221; % 淡紫红
173, 216, 230; % 淡天蓝
255, 165, 0; % 淡橙色
255, 222, 173; % 浅杏仁
192, 192, 192; % 淡灰色
255, 255, 255; % 白色
220, 220, 220; % 淡灰色
255, 228, 181; % 淡橙色
240, 230, 140; % 淡黄绿色
255, 215, 0 % 金黄色
] ./ 255; % 将 RGB 值映射到 [0, 1] 范围
% 循环绘图
for i=unique(machineId)'
t_sT=sT(machineId==i);
t_dT=dT(machineId==i);
[t_sT,t_ind]=sort(t_sT);
t_dT=t_dT(t_ind);
if ~isempty(rectangleData)
t_Str=rectangleData(machineId==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',colorList(i+2,:),'AlignVertexCenters','on');
end
for j=1:length(t_sT)
if ~isempty(rectangleData)
ganttHdl.(['t',num2str(i)])(j)=text((t_sT(j)+t_dT(j)+t_sT(j))/2,i,t_Str{j},'FontSize', 15, 'fontname','Times New Roman', 'HorizontalAlignment', 'center');
else
ganttHdl.(['t',num2str(i)])(j)=text(t_sT(j),i,'');
end
end
end
end
补充说明
如果横轴和纵轴名称为中文的时候,出现无法显示的情况,可按照下图操作:
第一步,在图片显示界面点击 工具->编辑图形
第二步,选中名称,点击右键,选择“字型”
第三步,将字体选择为“宋体”即可