甘特图又称为横道图、条状图,它是以作业排序为目的,将活动与时间联系起来的最早尝试的工具之一,能够很直观地显示项目、进度等和时间的内在关系随着时间的进展情况,在管理和生产活动中被广泛使用。
用来制作甘特图的专业工具也不少,常见的有:microsoft office project、ganttproject、warchart xgantt、jquery.gantt、excel等,网络上也有一些优质工具支持在线绘制甘特图。
可是这种现成的工具,往往也存在一些弊端,让编程人员不知所措。比如说,花里胡哨的ui,让人目不暇接,不知点哪个才好:
比如说,有些基于浏览器的图表需要掌握html、js等编程语言,只会点python的我直接被劝退:
再比如,进来就是注册、登录、试用,等搞完了这波操作,时间、精力也耗费得差不多了:
其实这种在线环境还有一个很大的弊端——安全性。我们永远也不知道用户的数据是去了开发者邮箱还是被短暂存储后销毁。
相比之下,还是简简单单的代码来的醒目、直观、安全又便捷。而且,第二种方式,使得图表的自定义程度也更高,配色、组件尺寸等调整也往往更加方便。
下面用一个例子来说明如何使用python绘制甘特图:
背景:假定疫苗生产需经过cj1、cj2、cj3、cj4共4个工位,且必须按照cj1-cj2-cj3-cj4的顺序轮流在4个工位加工。为防止疫苗包装出现混乱,规定每个工位不能同时生产不同类型的疫苗,且疫苗生产不允许插队,即进入第一个工位安排的每类疫苗的生产顺序一旦确定就要一直保持不变,而且前一种类型的疫苗离开某个工位后,后一种类型的疫苗才能进入这个工位。已知各工位生产加工10种疫苗的平均时长(单位:min)如下表:
目标:确定最短的总加工时间,并对生产过程以合适的方式进行呈现。
思路:在生产调度问题中,关于最短加工时长的目标优化问题,比较常见的算法是根据 johnson 规则推广的 cds 算法 ,在此不再赘述,感兴趣的朋友可以自行搜索。假定已确定的生产顺序为ym4-5-2-7-10-1-8-6-3-9,并计算出了每个工位的开始加工时间(单位:min),如下表:
针对生产过程呈现的问题,我们用python绘制甘特图来进行可视化处理。
首先,导入依赖的库:
import pandas as pdimport matplotlib.pyplot as pltimport 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()到此为止,一副甘特图就完工了。
可是对于咱们充满艺术细胞的数据从业者来说,图表的颜值也是相当重要,因此我们在来一个小小的美化,只需修改设置一下渐变配色列表就好~(来自十八线美工的手动配置)
colors = ['#3b9dd3', '#41ade8', '#48beff', '#44d5ff', '#40ebff', '#40e0cf', '#43c59e', '#42b091', '#409b83', '#51a48e']于是乎,一副精美的甘特图出来了~
最后,简单总结一下甘特图优缺点。
优点1.醒目、直观、易于理解;
2.方便调配各项业务及工作流程的时间安排;
3.有专业软件支持,无须担心复杂计算和分析。
局限1.仅仅部分地反映了活动流程的时间、成本和范围约束;
2.不适用于时间依赖关系过复杂的场景,否则将大大提高读图成本。
nova8系列来袭,升级EMUI 11体验同款功能
交流电桥的平衡条件是什么?
聚势共赢 英飞凌携手虹软共绘3D TOF产业新图景
DCS点检基础知识解析
小米性价比最高的四款手机:小米note3、小米6、小米mix2和小米5X,你打算入手哪一款?
怎么用Python绘制甘特图
扩频通信的基本原理 扩频通信为什么可以抗多径效应
上网本挑战智能本,谁才是真正的赢家?
LED电路的组成及性能
魅族pro7什么时候上市?魅族pro7跑分显露:骁龙835+90%屏占比+6GB,科技感爆棚
一加7 Pro首销告捷 1分钟全网销售额破亿
惠普已发布全新惠普智能教育本,为K12家庭量身定制一站式的学习方案
“超声波焊接机”在调试时出现损坏情况该如何处理
欧普照明2018财报报喜 净利润和营收大幅增长
霍金去世,但人类对宇宙和AI的探索永无止境
使用FPGA测试的一些有效方法
AI和ML可以提高生产力 更多的服务还有待努力开发
动态视频处理
2016年物联网发展十大亮点
游戏手机最近大热,魅族也要做了?