说明
直接运行main.m即可画出甘特图,横轴为时间轴,纵轴为机器编号
每个方块中依次为:任务编号 任务开始时刻 任务完成时刻
ps:1. 如果横轴和纵轴名称为中文,出现无法显示的问题,见“补充说明”
2. 车间调度的甘特图代码可见另一篇博文
运行效果
main.m代码
ganttData = [
% 第一行表示 任务开始时间
10 120 205 320 400 40 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 ;
% 第四行表示 任务编号
6 23 17 22 16 13 12 14 18 11 28 20 29 21 19 30 2 24 5 4 8 10 7 27 15 1 9 26 3 25
];
% 以第一列为例, 表示6号任务在机器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, :);
% 根据任务开始时间和结束时间计算 任务的持续时长
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(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
补充说明
如果横轴和纵轴名称为中文的时候,出现无法显示的情况,可按照下图操作:
第一步,在图片显示界面点击 工具->编辑图形
第二步,选中名称,点击右键,选择“字型”
第三步,将字体选择为“宋体”即可