MATLAB甘特图代码(任务类型的调度)

说明

直接运行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

补充说明

如果横轴和纵轴名称为中文的时候,出现无法显示的情况,可按照下图操作:
第一步,在图片显示界面点击 工具->编辑图形
在这里插入图片描述

第二步,选中名称,点击右键,选择“字型”
在这里插入图片描述

第三步,将字体选择为“宋体”即可
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝灰鼓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值