没有Project也能做项目管理,5分钟学会用Python做甘特图(python制作甘特图)

项目管理的神器MS PROJECT,以强悍的项目可视化能力让项目管理人士爱不释手,但由于版权和软件更新原因,导致很多时候,都没机会使用它,项目管理里必备的甘特图,做起来就很困难了。本文引入Python来做甘特图,让项目管理风生水起。

甘特图的概念

先给读者简单介绍下甘特图是什么?有什么用?

甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。其通过条状图来显示项目,进度,和其他时间相关的系统进展的内在关系随着时间进展的情况。以提出者亨利·劳伦斯·甘特(Henry Laurence Gantt)先生的名字命名。

甘特图以图示通过活动列表和时间刻度表示出特定项目的顺序与持续时间。一条线条图,横轴表示时间,纵轴表示项目,线条表示期间计划和实际完成情况。直观表明计划何时进行,进展与要求的对比。便于管理者弄清项目的剩余任务,评估工作进度。

甘特图是以作业排序为目的,将活动与时间联系起来的最早尝试的工具之一,帮助企业描述工作中心、超时工作等资源的使用。

没有Project也能做项目管理,5分钟学会用Python做甘特图(python制作甘特图)

甘特图包含以下三个含义:

1、以图形或表格的形式显示活动;

2、通用的显示进度的方法;

3、构造时含日历天和持续时间,不将周末节假算在进度内。

简单、醒目、便于编制,在管理中广泛应用。

Python生成甘特图的效果

为了简便起见,在用Python做甘特图之前,需要读者先动手准备几条简单数据,格式是:活动的名称,开始时间,结束时间。这样就构成了甘特图的基本元素。示例json数据如下:

{ 'label': 'Research',  'start':'2013-10-0112:00:00', 'end': '2013-10-02 18:00:00'}, # @IgnorePep8{ 'label': 'Compilation', 'start':'2013-10-0209:00:00', 'end': '2013-10-02 12:00:00'}, # @IgnorePep8{ 'label': 'Meeting #1', 'start':'2013-10-0312:00:00', 'end': '2013-10-03 18:00:00'}, # @IgnorePep8{ 'label': 'Design',  'start':'2013-10-0409:00:00', 'end': '2013-10-10 13:00:00'}, # @IgnorePep8{ 'label': 'Meeting #2', 'start':'2013-10-1109:00:00', 'end': '2013-10-11 13:00:00'}, # @IgnorePep8{ 'label': 'Implementation', 'start':'2013-10-1209:00:00', 'end': '2013-10-22 13:00:00'}, # @IgnorePep8{ 'label': 'Demo',  'start':'2013-10-2309:00:00', 'end': '2013-10-23 13:00:00'}, # @IgnorePep8

看看运行Python生成甘特图的效果吧。

没有Project也能做项目管理,5分钟学会用Python做甘特图(python制作甘特图)

Python生成甘特图

如图,每项活动都按日期顺序衔接了起来,能看明白项目之间的先后次序,并有清晰的图例说明,和project生成的效果也可以媲美了吧。当然,示例中的甘特图不支持嵌套任务,但是它对于描述简单的任务分解结构已经够用了。还有很多细致的Project功能,大家不妨可以作为小练习来编写。

编程思路

接下来将使用下面的代码示例展示如何使用Python和matplotlib绘制甘特图。执行下面的步骤。

没有Project也能做项目管理,5分钟学会用Python做甘特图(python制作甘特图)

1.加载包含任务的TEST_DATA,并用TEST_DATA实例化Gantt类。

2.每一个任务包含一个标签,及开始和结束时间。

3.在坐标轴上绘制水平条来表示所有的任务。

4.为渲染的数据格式化x轴和y轴。

5.让图表布局紧凑些。

6.显示甘特图。

下面是示例代码。

from datetime import datetimeimport sysimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.font_manager as font_managerimport matplotlib.dates as mdatesimport loggingclass Gantt(object):'''Simple Gantt renderer.Uses *matplotlib* rendering capabilities.'''# Red Yellow Green diverging colormap# from http://colorbrewer2.org/RdYlGr = ['#d73027', '#f46d43', '#fdae61','#fee08b', '#ffffbf', '#d9ef8b','#a6d96a', '#66bd63', '#1a9850']POS_START = 1.0POS_STEP = 0.5def __init__(self, tasks):self._fig = plt.figure()self._ax = self._fig.add_axes([0.1, 0.1, .75, .5])self.tasks = tasks[::-1]def _format_date(self, date_string):'''Formats string representation of *date_string* into*matplotlib. dates*instance.'''try:date = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S')except ValueError as err:logging.error("String '{0}' can not be converted todatetime object: {1}".format(date_string, err))sys.exit(-1)mpl_date = mdates.date2num(date)return mpl_datedef _plot_bars(self):'''Processes each task and adds *barh* to the current *self._ax*(*axes*).'''i = 0for task in self.tasks:start = self._format_date(task['start'])end = self._format_date(task['end'])bottom = (i * Gantt.POS_STEP) Gantt.POS_STARTwidth = end – startself._ax.barh(bottom, width, left=start, height=0.3,align='center', label=task['label'],color = Gantt.RdYlGr[i])i = 1def _configure_yaxis(self):'''y axis'''task_labels = [t['label'] for t in self.tasks]pos = self._positions(len(task_labels))ylocs = self._ax.set_yticks(pos)ylabels = self._ax.set_yticklabels(task_labels)plt.setp(ylabels, size='medium')def _configure_xaxis(self):'''x axis'''# make x axis date axisself._ax.xaxis_date()# format date to ticks on every 7 daysrule = mdates.rrulewrapper(mdates.DAILY, interval=7)loc = mdates.RRuleLocator(rule)formatter = mdates.DateFormatter("%d %b")self._ax.xaxis.set_major_locator(loc)self._ax.xaxis.set_major_formatter(formatter)xlabels = self._ax.get_xticklabels()plt.setp(xlabels, rotation=30, fontsize=9)def _configure_figure(self):self._configure_xaxis()self._configure_yaxis()self._ax.grid(True, color='gray')self._set_legend()self._fig.autofmt_xdate()def _set_legend(self):'''Tweak font to be small and place *legend*in the upper right corner of the figure'''font = font_manager.FontProperties(size='small')self._ax.legend(loc='upper right', prop=font)def _positions(self, count):'''For given *count* number of positions, get array for thepositions.'''end = count * Gantt.POS_STEP Gantt.POS_STARTpos = np.arange(Gantt.POS_START, end, Gantt.POS_STEP)return pos

下面的代码定义了生成甘特图的主函数。在这个函数中,我们把数据加载到一个实例中,绘制出相应的水平条、设置好时间坐标轴(x 轴)的日期格式,并设置 y 轴(项目任务)上的值。

def show(self):self._plot_bars()self._configure_figure()plt.show()if __name__ == '__main__':TEST_DATA = ({ 'label': 'Research',  'start':'2013-10-0112:00:00', 'end': '2013-10-02 18:00:00'}, # @IgnorePep8{ 'label': 'Compilation', 'start':'2013-10-0209:00:00', 'end': '2013-10-02 12:00:00'}, # @IgnorePep8{ 'label': 'Meeting #1', 'start':'2013-10-0312:00:00', 'end': '2013-10-03 18:00:00'}, # @IgnorePep8{ 'label': 'Design',  'start':'2013-10-0409:00:00', 'end': '2013-10-10 13:00:00'}, # @IgnorePep8{ 'label': 'Meeting #2', 'start':'2013-10-1109:00:00', 'end': '2013-10-11 13:00:00'}, # @IgnorePep8{ 'label': 'Implementation', 'start':'2013-10-1209:00:00', 'end': '2013-10-22 13:00:00'}, # @IgnorePep8{ 'label': 'Demo',  'start':'2013-10-2309:00:00', 'end': '2013-10-23 13:00:00'}, # @IgnorePep8)gantt = Gantt(TEST_DATA)gantt.show()

代码就生成前面那个简单美观的甘特图,如图8-5所示。

没有Project也能做项目管理,5分钟学会用Python做甘特图(python制作甘特图)

图8-5

代码解读

我们从上面代码底部的"__main__"中 if 语句检查之后开始读。在给定 TEST_DATA参数实例化 Gantt 类之后,我们为该实例创建一些必要的字段。把 TASK_DATA

没有Project也能做项目管理,5分钟学会用Python做甘特图(python制作甘特图)

保存在self.tasks字段中,并且创建坐标轴和图形窗口来保存接下来要创建的图表。

没有Project也能做项目管理,5分钟学会用Python做甘特图(python制作甘特图)

然后,在实例上调用show()方法,该方法执行所需的步骤创建出甘特图。

def show(self):

self._plot_bars()

self._configure_figure()

plt.show()

绘制水平条需要一个循环,在循环中把每一个任务的名称和持续时间数据应用到matplotlib.pyplot.barh 函数上,并把它添加到 self._ax 坐标轴中。通过给每一个任务一个不同(增量)的bottom参数值,我们可以把每个任务放在一个单独的通道上。

并且,为了能容易地把任务映射到它们的名字上,我们对其循环应用colorbrewer2. org工具生成的divergent颜色表。

下一步是配置图表,即设置 x 轴上的日期格式和 y 轴上的刻度位置和标签,来与用matplotlib.pyplot.barh函数绘制的任务进行匹配。

然后,对grid和legend做最后的调整。

最后,调用plt.show()把图表显示出来。

结语

本文从替代Project,用Python来生成甘特图开始,从准备数据到代码详解,都一一说来,希望对大家的项目工作有帮助,让Python提高工作效率,让生活更幸福。

没有Project也能做项目管理,5分钟学会用Python做甘特图(python制作甘特图)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2023年11月23日 上午8:26
下一篇 2023年11月23日 上午8:36

相关推荐

  • 邵阳市直机关党建工作量化管理考核50条成效初显(党建工作量化考核办法)

    (通讯员 周树国)8月9日至18日,邵阳市直机关工委会同市离退休干部工委、市委督查室组成7个督查组,深入组织关系在市直机关工委的89个市直单位,对今年以来机关党建工作进行全面督查。…

    科研百科 2024年6月29日
    64
  • 瓜果飘香牛羊肥 特色产业助增收

      本报记者冯建伟UYf   “2008年中粮屯河在乌什县投资建厂后,我们过去只能鲜食、晒干的小杏子就做起了大文章!”新疆乌什县农业局局长阿力木&middo…

    科研百科 2022年6月5日
    365
  • 项目施工进度计划表

    项目施工进度计划表 随着项目的推进,我们的施工进度计划表也越来越清晰。这个计划表将帮助我们跟踪项目的进度,确保我们能够按时完成任务。在本文中,我们将介绍如何编制一个有效的项目施工进…

    科研百科 2024年8月16日
    40
  • 四川一面包车塞进两头牛 车上还坐4人

    8XO 驾驶员将两头牛塞进了面包车。8XO 8XO   8月2日,四川省遂宁市公安局官方微博发布微博称,当日中午,三家派出所民警在巡逻中发现,一辆银白色的面包车上竟然载了两头牛。据…

    2022年5月24日
    298
  • 代建项目合同管理

    代建项目合同管理 随着现代建筑行业的发展,代建项目合同管理已经成为了项目管理中不可或缺的一部分。代建项目合同管理是指在项目开发过程中,通过合同管理方式对项目的各个阶段、各个环节进行…

    科研百科 2024年8月22日
    42
  • 项目进度管理职责

    项目进度管理职责 在项目管理工作中,进度管理是一项非常重要的任务。项目进度管理职责是指项目经理或项目团队成员必须履行的一系列职责,以确保项目按计划进行,并达到预定的交付日期。 以下…

    科研百科 2024年8月20日
    45
  • 科研项目财务管理包括哪三部分

    科研项目财务管理包括哪三部? 科研项目财务管理是项目管理中至关重要的一部分,它涉及到财务方面的管理,以确保项目的资金充足、高效、可持续。在科研项目财务管理中,通常包括以下三部: 1…

    科研百科 2024年10月10日
    11
  • 合同管理简介

    合同管理简介 合同管理是指对合同进行有效的管理和跟踪,以确保合同的合法性、有效性和履行情况进行监管。合同管理对于企业、政府机构和个人都具有重要意义,可以帮助企业提高效率,减少风险,…

    科研百科 2024年8月25日
    33
  • 基层人才培养:党建事业持续发展的关键(基层人才培养-党建事业持续发展的关键是什么)

    随着社会的快速发展和经济的不断变革,基层党建工作面临着越来越大的挑战。如何培养一支高素质、有担当、能作为的基层干部队伍,已成为党建工作中必须重视的问题。以下将就基层人才培养的重要性…

    科研百科 2024年7月5日
    48
  • 玉门市与酒钢集团签订新能源项目合作协议(酒钢集团协同办公)

    9月18日,玉门市举行签约仪式,与酒钢集团宏晟电热有限公司签订新能源项目合作协议,玉门市委副书记、市政府市长王超主持签约仪式,酒钢集团党委副书记、总经理魏志斌,玉门市政协主席何世才…

    2022年6月21日
    427