甘特图,看这篇就够了

甘特图又称为横道图、条状图,它是以作业排序为目的,将活动与时间联系起来的最早尝试的工具之一,能够很直观地显示项目、进度等和时间的内在关系随着时间的进展情况,在管理和生产活动中被广泛使用。

用来制作甘特图的专业工具也不少,常见的有:Microsoft Office Project、GanttProject、WARCHART XGantt、jQuery.Gantt、Excel等,网络上也有一些优质工具支持在线绘制甘特图。

可是这种现成的工具,往往也存在一些弊端,让编程人员不知所措。比如说,花里胡哨的UI,让人目不暇接,不知点哪个才好:

f3ac1a28c2365310153cf3d80a9b472e.png

比如说,有些基于浏览器的图表需要掌握HTML、JS等编程语言,只会点Python的我直接被劝退:

7872b621e27811ef6a4b2251f5f8ca24.png

再比如,进来就是注册、登录、试用,等搞完了这波操作,时间、精力也耗费得差不多了:

0d99796c13125ca9f050b4ce6f6929a1.png

其实这种在线环境还有一个很大的弊端——安全性。我们永远也不知道用户的数据是去了开发者邮箱还是被短暂存储后销毁。

相比之下,还是简简单单的代码来的醒目、直观、安全又便捷。而且,第二种方式,使得图表的自定义程度也更高,配色、组件尺寸等调整也往往更加方便。

下面用一个例子来说明如何使用Python绘制甘特图:

背景:假定疫苗生产需经过CJ1、CJ2、CJ3、CJ4共4个工位,且必须按照CJ1-CJ2-CJ3-CJ4的顺序轮流在4个工位加工。为防止疫苗包装出现混乱,规定每个工位不能同时生产不同类型的疫苗,且疫苗生产不允许插队,即进入第一个工位安排的每类疫苗的生产顺序一旦确定就要一直保持不变,而且前一种类型的疫苗离开某个工位后,后一种类型的疫苗才能进入这个工位。已知各工位生产加工10种疫苗的平均时长(单位:min)如下表:

df3df1137faf7d778c8da07614e823f8.png

目标:确定最短的总加工时间,并对生产过程以合适的方式进行呈现。

思路:在生产调度问题中,关于最短加工时长的目标优化问题,比较常见的算法是根据 Johnson 规则推广的 CDS 算法 ,在此不再赘述,感兴趣的朋友可以自行搜索。假定已确定的生产顺序为YM4-5-2-7-10-1-8-6-3-9,并计算出了每个工位的开始加工时间(单位:min),如下表:

c6e0b935c922d9612126566eb757e598.png

针对生产过程呈现的问题,我们用Python绘制甘特图来进行可视化处理。

首先,导入依赖的库:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches

正常显示中文和负号:

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

读取数据表,获取各工位加工时长和各工位开始加工时间:

df1 = pd.read_excel('time.xlsx', sheet_name='continue_time', index_col='YM')
df2 = pd.read_excel('time.xlsx', sheet_name='start_time', index_col='YM')

CJS = ['CJ1', 'CJ2', 'CJ3', 'CJ4']
YMS = ['YM4', 'YM5', 'YM2', 'YM7', 'YM10', 'YM1', 'YM8', 'YM6', 'YM3', 'YM9']

# continue_time:各工位加工时长,start_time:各工位开始加工时间
continue_time = []
start_time = []
for cj in CJS:
    continue_time.append([ym for ym in df1[cj][YMS]])
    start_time.append([ym for ym in df2[cj][YMS]])

获取数组大小,用于之后的循环:

m = range(len(continue_time))
n = range(len(continue_time[0]))

以下是绘图过程:

# 指定每个水平柱子颜色
colors = ['r', 'pink', 'orange', 'y', 'g', 'b', 'deeppink', 'purple', 'brown', 'black']

# 设置画布大小和分辨率
plt.figure(figsize=(20, 8), dpi=200)
# barh:水平柱状图,设置循坏迭代以绘制层叠效果
for i in m:
    for j in n:
        plt.barh(m[i] + 1, continue_time[i][j], left=start_time[i][j], color=colors[j])
plt.title("疫苗生产甘特图", fontsize=17)
labels = [''] * len(continue_time[0])
for f in n:
    labels[f] = "YM%d" % (f + 1)
# 添加图例
patches = [mpatches.Patch(color=colors[i],label="{:s}".format(labels[i])) for i in range(len(continue_time[0]))]
plt.legend(handles=patches, loc=4)
# XY轴标签
plt.xlabel("加工时间/分钟", fontsize=15)
plt.ylabel("各工位加工流程", fontsize=15)
# XY轴刻度
plt.yticks([1, 2, 3, 4], ['CJ1', 'CJ2', 'CJ3', 'CJ4'])
# 网格线,此图使用不好看,注释掉
# plt.grid(linestyle="--",alpha=0.5)
plt.savefig('gatte.jpg')
plt.show()

到此为止,一副甘特图就完工了。

f5560dc85c0566dc3a407893a5a71b0d.png

可是对于咱们充满艺术细胞的数据从业者来说,图表的颜值也是相当重要,因此我们在来一个小小的美化,只需修改设置一下渐变配色列表就好~(来自十八线美工的手动配置🙄)

colors = ['#3B9DD3', '#41ADE8', '#48BEFF', '#44D5FF', '#40EBFF', '#40E0CF', '#43C59E', '#42B091', '#409B83', '#51A48E']

于是乎,一副精美的甘特图出来了~

140ae3fa570772bcde26cad1cb74660f.png

考虑到有些小伙伴不是很喜欢渐变色,或者对色彩的区分度要求比较高,亦或者,老板大人是个色狼,哦不对,色盲,那么下一种配色方案就显得格外重要了😎

(将上面第一步的设置渐变配色列表替换为以下内容即可~)

from colour import Color
red = Color("red")
colors = list(red.range_to(Color("purple"), 14))
colors = [color.rgb for color in colors]

结果如下:

2bede6b21fa9bbd8aee8a8d4e372d02f.png

是漂亮的彩虹色!无论对方是女王御姐萝莉正太少女还是奶狗学长大叔气质男神,分分钟给他征服!这也是一个很通用的小技巧,对于可视化工作有很大帮助~

最后,简单总结一下甘特图优缺点。

优点

1.醒目、直观、易于理解;

2.方便调配各项业务及工作流程的时间安排;

3.有专业软件支持,无须担心复杂计算和分析。

局限

1.仅仅部分地反映了活动流程的时间、成本和范围约束;

2.不适用于时间依赖关系过复杂的场景,否则将大大提高读图成本。

*********************************************************************最新更新: 1、提高了拖拉的速度。不会出现闪烁。 2、同工艺之间可以换机台加工,同工艺机台用同一种颜色来显示。 3、可以显示完成度。********************************************************************该甘特图控件纯属个人开发,使用DELPHI开发。1、该控件主要用于生产排程或计划用。2、该甘特图可以自由拖拉更改时间,时间轴可以自由缩放,显示不同的界面效果。3、可以自由设置3D、更改甘特图大小,是否让用户移动甘特图等效果属性设置。 gant3d,gantchanged,gantmoved这三个属性来控制。4、该甘特图不用设置颜色,会随机获取颜色,并把相同模号的颜色设置为一样。 当用鼠标点击一个零件时,该套模所有的零件都会变成红色,这个颜色是唯一的, 方便用户查看该模的进度。5、该甘特图开发周期短,不可避免有很多不如意的地方希望大家提出宝贵的意见。6、该甘特图是本人研究成果,暂时只能给出试用版出来。demo里显示的数据是几种工序的机台信息,大家可以用排程软件给这些工序排程来测试效果。排程软件的 用户名是admin,密码是1,登陆后就可以进行排程操作。大家可以进入我的空间下载最新的甘特图控件!http://cxing1985.ys168.com/作者:星火燎燃QQ:251276845 手机:13632994209E-mail:cxing1985@126.com.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值