0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么用Python绘制甘特图

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-31 10:59 次阅读

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

用来制作甘特图的专业工具也不少,常见的有: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']

于是乎,一副精美的甘特图出来了~
最后,简单总结一下甘特图优缺点。

优点

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

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

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

局限

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程语言
    +关注

    关注

    9

    文章

    1878

    浏览量

    33153
  • 浏览器
    +关注

    关注

    1

    文章

    975

    浏览量

    34429
  • python
    +关注

    关注

    51

    文章

    4678

    浏览量

    83476
收藏 人收藏

    评论

    相关推荐

    Labview 如何绘制甘特图(横道图)?遇到个难题,需要将工序画出来

    Labview 如何绘制甘特图(横道图)?遇到个难题,需要将工序画出来
    发表于 01-16 13:47

    labview实现词云图绘制(非python接口)

    ` 网上有很多词图云生成器,python也能用封装好的接口在线调用,不求原理的调用,labview在本地生成词云图来解释下面生成的原理:核心函数块:图片文字绘制,获取文字区域原理:首先在图片中可
    发表于 06-07 12:08

    使用Python做一个眼图的绘制

    本例使用了Python中的两个绘图库matplotlib和pyqtgraph,对眼图进行了绘制,同时包含了对眼图使用bokeh效果。
    发表于 06-12 15:18

    如何绘制Python的折线图和散点图

    Python数据分析:折线图和散点图的绘制
    发表于 06-08 16:45

    如何使用Python绘制饼图

    的面积确定零件相对于整体的相对量子或百分比。饼图经常用于业务演示中,因为它们可以快速总结业务活动,例如销售,运营等。饼形图还大量用于调查结果,新闻文章,资源使用图中。那么如何使用Python绘制饼图
    发表于 08-19 17:39

    汉化的甘特图源码

    汉化的甘特图源码 基于applet的甘特图的源码,已经汉化,甘特图可以显示汉字了
    发表于 03-24 15:20 8次下载

    如何使用Python绘制PDF文件教程详细说明

    本文档的主要内容详细介绍的是如何使用Python绘制PDF文件教程详细说明。
    发表于 08-27 11:48 12次下载
    如何使用<b class='flag-5'>Python</b><b class='flag-5'>绘制</b>PDF文件教程详细说明

    怎样使用Python去进行可视化绘制

    今天给大家带来绘制“手绘风格”可视化作品的小技巧,主要涉及Python编码绘制,内容如下。
    的头像 发表于 06-23 11:49 1907次阅读
    怎样使用<b class='flag-5'>Python</b>去进行可视化<b class='flag-5'>绘制</b>?

    使用Python绘制LoRa节点的实时数据

    电子发烧友网站提供《使用Python绘制LoRa节点的实时数据.zip》资料免费下载
    发表于 12-22 15:44 0次下载
    使用<b class='flag-5'>Python</b><b class='flag-5'>绘制</b>LoRa节点的实时数据

    Python绘制世界地图

    Python之所以这么流行,是因为它不仅能够应用于科技领域,还能用来做许多其他学科的研究工具,绘制地图便是其功能之一。 今天我们用matplot工具包之一的 mpl_toolkits 来绘制世界地图
    的头像 发表于 10-17 11:18 499次阅读
    用<b class='flag-5'>Python</b>来<b class='flag-5'>绘制</b>世界地图

    Diagrams :基于Python绘制云系统架构的模块

    Diagrams 是一个基于Python绘制云系统架构的模块,它能够通过非常简单的描述就能可视化架构,并支持以下6个云产品的图标: AWS、Azure、GCP、K8s、阿里云 和 Oracle
    的头像 发表于 10-21 10:20 267次阅读
    Diagrams :基于<b class='flag-5'>Python</b><b class='flag-5'>绘制</b>云系统架构的模块

    Diagrams:基于Python绘制云系统架构的模块

    Diagrams 是一个基于Python绘制云系统架构的模块,它能够通过非常简单的描述就能可视化架构,并支持以下6个云产品的图标: AWS、Azure、GCP、K8s、阿里云 和 Oracle
    的头像 发表于 10-30 14:18 218次阅读
    Diagrams:基于<b class='flag-5'>Python</b><b class='flag-5'>绘制</b>云系统架构的模块

    Diagrams:基于Python绘制云系统架构的模块

    Diagrams 是一个基于Python绘制云系统架构的模块,它能够通过非常简单的描述就能可视化架构,并支持以下6个云产品的图标: AWS、Azure、GCP、K8s、阿里云 和 Oracle
    的头像 发表于 11-01 09:35 202次阅读
    Diagrams:基于<b class='flag-5'>Python</b><b class='flag-5'>绘制</b>云系统架构的模块

    绘制同切圆python代码怎么运行

    绘制同切圆是一个很有趣的数学问题,可以使用Python语言进行实现。在这篇文章中,我们将探讨同切圆的概念、绘制同切圆的算法和Python代码的实现。 同切圆的概念 同切圆是指具有相同圆
    的头像 发表于 11-28 15:55 879次阅读

    基于Python的地图绘制教程

    本文将介绍通过Python绘制地形图的方法,所需第三方Python相关模块包括 rasterio、geopandas、cartopy 等,可通过 pip 等方式安装。
    的头像 发表于 02-26 09:53 316次阅读
    基于<b class='flag-5'>Python</b>的地图<b class='flag-5'>绘制</b>教程