一篇文章教你学会使用Python绘制甘特图
作者:朱小五是凹凸君呀 发布时间:2021-03-10 09:53:24
用来制作甘特图的专业工具也不少,常见的有: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 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()
到此为止,一副甘特图就完工了。
可是对于咱们充满艺术细胞的数据从业者来说,图表的颜值也是相当重要,因此我们在来一个小小的美化,只需修改设置一下渐变配色列表就好~(来自十八线美工的手动配置)
colors = ['#3B9DD3', '#41ADE8', '#48BEFF', '#44D5FF', '#40EBFF', '#40E0CF', '#43C59E', '#42B091', '#409B83', '#51A48E']
于是乎,一副精美的甘特图出来了~
考虑到有些小伙伴不是很喜欢渐变色,或者对色彩的区分度要求比较高,亦或者,老板大人是个色狼,哦不对,色盲,那么下一种配色方案就显得格外重要了
(将上面第一步的设置渐变配色列表替换为以下内容即可~)
from colour import Color
red = Color("red")
colors = list(red.range_to(Color("purple"), 14))
colors = [color.rgb for color in colors]
结果如下:
是漂亮的彩虹色!无论对方是女王御姐萝莉正太少女还是奶狗学长大叔气质男神,分分钟给他征服!这也是一个很通用的小技巧,对于可视化工作有很大帮助~
最后,简单总结一下甘特图优缺点。
优点
1.醒目、直观、易于理解;
2.方便调配各项业务及工作流程的时间安排;
3.有专业软件支持,无须担心复杂计算和分析。
局限
1.仅仅部分地反映了活动流程的时间、成本和范围约束;
2.不适用于时间依赖关系过复杂的场景,否则将大大提高读图成本。
一日一书
《数据分析从Excel到Power BI:Power BI商业数据分析思维、技术与实践》本书以 Power BI 数据分析软件为平台,将企业实际工作需求作为出发点,分别从思维、技术、实践这三个方面,全面系统地讲解和分享了Power BI在企业日常数据分析场景的运用思维、实操技能及综合管理应用的思路。
来源:https://blog.csdn.net/zhuxiao5/article/details/120446507
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- The test clienttest client是一个python类,来模拟一个简单的“哑”浏览器,允许你来测试你的view函数.你可以
- 1.思路在网上查找了半天,基本都是提取word中文字的,没有找到可以把word中的图片提取出来的方法。一个巧合的情况下,发现将word的后缀
- 简介程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作,一般是将数字化为二进制数后进行操作
- 1、数据集简述: 虽然有主流庞大的COCO、VOC数据集,
- 内置函数常用函数1.数学相关•abs(x)abs()返回一个数字的绝对值。如果给出复数,返回值就是该复数的模。>>>pri
- linecache模块接触到linecache这个模块是因为前两天读attrs源码的时候看到内部代码引用了这个模块来模拟一个假文件,带着一脸
- 大家有没有这种感觉,一到国庆、春节这种长假,抢火车票就非常困难?各大互联网公司都推出抢票服务,只要加钱给服务费就可以增加抢到票的几率。有些火
- dict获取关键字与值values()>>> d{'p': 34, 'l': 54,
- 这篇文章主要介绍了pyinstaller还原python代码过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习
- 1.用python调用python脚本#!/usr/local/bin/python3.7import timeimport os coun
- 生活中我们为了保障房间里物品的安全,所以给门进行上锁,在我们需要进入房间的时候又会重新打开。同样的之间我们讲过多线程中的lock,作用是为了
- 类的特殊成员之call#!/usr/bin/env python# _*_coding:utf-8 _*_class SpecialMemb
- 本文实例讲述了js实现全国省市二级联动下拉选择菜单,分享给大家供大家参考。具体如下:效果图: 具体代码:<html>&
- 主要代码如下: total = application("All
- ThreadLocal在threading模块中,可以见得它是为我们的线程服务的。它的主要作用是存储当前线程的变量,各个线程之间的变量名是可
- 下面这段代码,不会替换ld<sad中间的<,所以内容仍然是正常的 <% function nohtml(str) dim
- 相关概念并发:指一个时间段内,有几个程序在同一个cpu上运行,但是任意时刻只有一个程序在cpu上运行。比如说在一秒内cpu切换了100个进程
- python2.7安装目录下没有Scripts文件夹。这种问题可能是你装的python安装包年代久远了,到官网下载最新的python2.7安
- 这样做的好处是:利用表格来装载数据,不言而喻是最好的,你可以很灵活的为每个单元格定义样式。下面是具体的做法首先在photoshop设计一个效
- scikit-learn库scikit-learn已经封装好很多数据挖掘的算法现介绍数据挖掘框架的搭建方法1.转换器(Transformer