沒有Project也可以!5分鐘學會用Python做項目管理甘特圖

2021-01-07 python大大

項目管理的神器MS PROJECT,以強悍的項目可視化能力讓項目管理人士愛不釋手,但由於版權和軟體更新原因,導致很多時候,都沒機會使用它,項目管理裡必備的甘特圖,做起來就很困難了。本文引入Python來做甘特圖,讓項目管理風生水起。

甘特圖的概念

先給讀者簡單介紹下甘特圖是什麼?有什麼用?

甘特圖(Gantt chart)又稱為橫道圖、條狀圖(Bar chart)。其通過條狀圖來顯示項目,進度,和其他時間相關的系統進展的內在關係隨著時間進展的情況。以提出者亨利·勞倫斯·甘特(Henry Laurence Gantt)先生的名字命名。

甘特圖以圖示通過活動列表和時間刻度表示出特定項目的順序與持續時間。一條線條圖,橫軸表示時間,縱軸表示項目,線條表示期間計劃和實際完成情況。直觀表明計劃何時進行,進展與要求的對比。便於管理者弄清項目的剩餘任務,評估工作進度。

甘特圖是以作業排序為目的,將活動與時間聯繫起來的最早嘗試的工具之一,幫助企業描述工作中心、超時工作等資源的使用。

甘特圖包含以下三個含義:

1、以圖形或表格的形式顯示活動;

2、通用的顯示進度的方法;

3、構造時含日曆天和持續時間,不將周末節假算在進度內。

簡單、醒目、便於編制,在管理中廣泛應用。

Python生成甘特圖的效果

為了簡便起見,在用Python做甘特圖之前,需要讀者先動手準備幾條簡單數據,格式是:活動的名稱,開始時間,結束時間。這樣就構成了甘特圖的基本元素。示例json數據如下:

{ 'label': 'Research',  'start':'2013-10-01

12:00:00', 'end': '2013-10-02 18:00:00'}, # @IgnorePep8

{ 'label': 'Compilation', 'start':'2013-10-02

09:00:00', 'end': '2013-10-02 12:00:00'}, # @IgnorePep8

{ 'label': 'Meeting #1', 'start':'2013-10-03

12:00:00', 'end': '2013-10-03 18:00:00'}, # @IgnorePep8

{ 'label': 'Design',  'start':'2013-10-04

09:00:00', 'end': '2013-10-10 13:00:00'}, # @IgnorePep8

{ 'label': 'Meeting #2', 'start':'2013-10-11

09:00:00', 'end': '2013-10-11 13:00:00'}, # @IgnorePep8

{ 'label': 'Implementation', 'start':'2013-10-12

09:00:00', 'end': '2013-10-22 13:00:00'}, # @IgnorePep8

{ 'label': 'Demo',  'start':'2013-10-23

09:00:00', 'end': '2013-10-23 13:00:00'}, # @IgnorePep8

看看運行Python生成甘特圖的效果吧。

Python生成甘特圖

如圖,每項活動都按日期順序銜接了起來,能看明白項目之間的先後次序,並有清晰的圖例說明,和project生成的效果也可以媲美了吧。當然,示例中的甘特圖不支持嵌套任務,但是它對於描述簡單的任務分解結構已經夠用了。還有很多細緻的Project功能,大家不妨可以作為小練習來編寫。

編程思路

接下來將使用下面的代碼示例展示如何使用Python和matplotlib繪製甘特圖。執行下面的步驟。

1.加載包含任務的TEST_DATA,並用TEST_DATA實例化Gantt類。

2.每一個任務包含一個標籤,及開始和結束時間。

3.在坐標軸上繪製水平條來表示所有的任務。

4.為渲染的數據格式化x軸和y軸。

5.讓圖表布局緊湊些。

6.顯示甘特圖。

下面是示例代碼。

from datetime import datetime

import sys

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.font_manager as font_manager

import matplotlib.dates as mdates

import logging

class Gantt(object):

'''

Simple Gantt renderer.

Uses *matplotlib* rendering capabilities.

'''

# Red Yellow Green diverging colormap

RdYlGr = ['#d73027', '#f46d43', '#fdae61',

'#fee08b', '#ffffbf', '#d9ef8b',

'#a6d96a', '#66bd63', '#1a9850']

POS_START = 1.0

POS_STEP = 0.5

def __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 to

datetime object: {1}"

.format(date_string, err))

sys.exit(-1)

mpl_date = mdates.date2num(date)

return mpl_date

def _plot_bars(self):

'''

Processes each task and adds *barh* to the current *self._ax*(*axes*).

'''

i = 0

for task in self.tasks:

start = self._format_date(task['start'])

end = self._format_date(task['end'])

bottom = (i * Gantt.POS_STEP) + Gantt.POS_START

width = end - start

self._ax.barh(bottom, width, left=start, height=0.3,

align='center', label=task['label'],

color = Gantt.RdYlGr[i])

i += 1

def _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 axis

self._ax.xaxis_date()

# format date to ticks on every 7 days

rule = 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 the

positions.

'''

end = count * Gantt.POS_STEP + Gantt.POS_START

pos = 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-01

12:00:00', 'end': '2013-10-02 18:00:00'}, # @IgnorePep8

{ 'label': 'Compilation', 'start':'2013-10-02

09:00:00', 'end': '2013-10-02 12:00:00'}, # @IgnorePep8

{ 'label': 'Meeting #1', 'start':'2013-10-03

12:00:00', 'end': '2013-10-03 18:00:00'}, # @IgnorePep8

{ 'label': 'Design',  'start':'2013-10-04

09:00:00', 'end': '2013-10-10 13:00:00'}, # @IgnorePep8

{ 'label': 'Meeting #2', 'start':'2013-10-11

09:00:00', 'end': '2013-10-11 13:00:00'}, # @IgnorePep8

{ 'label': 'Implementation', 'start':'2013-10-12

09:00:00', 'end': '2013-10-22 13:00:00'}, # @IgnorePep8

{ 'label': 'Demo',  'start':'2013-10-23

09:00:00', 'end': '2013-10-23 13:00:00'}, # @IgnorePep8

)

gantt = Gantt(TEST_DATA)

gantt.show()

代碼就生成前面那個簡單美觀的甘特圖,如圖8-5所示。

圖8-5

代碼解讀

我們從上面代碼底部的"__main__"中 if 語句檢查之後開始讀。在給定 TEST_DATA參數實例化 Gantt 類之後,我們為該實例創建一些必要的欄位。把 TASK_DATA

保存在self.tasks欄位中,並且創建坐標軸和圖形窗口來保存接下來要創建的圖表。

然後,在實例上調用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提高工作效率,讓生活更幸福。

相關焦點

  • 如何製作甘特圖,用甘特圖做好項目管理
    用圖表製作的甘特圖不僅能顯示每一項任務的耗時和進度,還可以看到在某個時間點在執行哪項任務。本文就一起來看看如何用製作甘特圖吧。甘特圖是隨時間推移安排項目的直觀視圖。它以圖示的方式展示任務列表和時間,很清晰地標誌出直到每一項任務的開始與結束時間,透明化地呈現項目的:啟動、計劃、執行、監控、收尾各個關鍵階段,拆分每個階段的任務、時間節點,分配負責人,清晰地把控整個項目。並且甘特圖反映了項目管理的三重約束:時間、成本和範圍,是項目管理必備的工具之一。
  • 如何用甘特圖管理自己的項目計劃
    進度控制需要各階段和各部門之間的緊密配合和協作,因此,只有將各階段與各部門的數據銜接起來,才能有效地進行建築工程項目的進度控制,在項目管理中,項目管理工具可以幫助項目經理解決這個問題。進度貓可以團隊協作,項目經理可以隨時隨地的了解團隊成員的任務完成情況,對項目整體進度隨時把控。什麼是甘特圖?甘特圖又叫橫道圖,甘特圖因形象直觀,在項目中的應用較為廣泛。
  • 項目進度管理方法:甘特圖
    對於企業來說,一個大型項目靠手工或者Excel完成項目的任務制定或者項目進度管理難度相當大的,因此,如果有一個合適的項目進度管理軟體,對項目來說能夠起到事半功倍的作用,項目經理不僅可以利用甘特圖來進行進度規劃,在各個任務之間根據進度進行資源協調、團隊協作。
  • 學會3種職場項目甘特圖,受用一生!動態甘特圖還收到老闆的表揚~
    其通過條狀圖來顯示項目,進度,和其他時間相關的系統進展的內在關係隨著時間進展的情況。以提出者亨利·勞倫斯·甘特(Henry Laurence Gantt)先生的名字命名。(解釋來自百度百科,侵刪)適用場景項目管理,顯示項目進度等時,通常需要用到甘特圖。
  • 項目進度管理工具——甘特圖
    甘特圖目前被廣泛的應用於項目管理,是製作最簡單,最直觀、最容易理解的項目管理方法,很多人依然利用Excel現成的表格模式,製作甘特圖,雖然Excel自帶強大的函數計算公式,可以讓你把數據直接在Excel進行計算,但是跟專業軟體相比,結合項目實際,小型項目用Excel還行,但是Excel對大中型項目來說就達不到項目所需
  • 甘特圖——輕鬆搞定項目進度管理
    大家可能都有過這樣的經歷和感受,做計劃時信誓旦旦,卻總是半途而廢;想提升自己,一段時間後卻發現自己還在原地徘徊;想高效完成工作及生活中的各種目標,卻總是不得其法;這是因為你不懂目標管理,那麼,你就有必要學一下如何用甘特圖管理自己的計劃了。
  • 那是因為你不會用甘特圖來做會議管理
    根據圖示,可以很直觀地看出項目的整體規劃,明月每一個事項的截止時間,將大目標拆解成一個個小目標。這個工具使用起來非常簡單,橫柚表示時間,縱柚表示項目(任務),線條表示在整個期間上計劃和實際完成的任務情況。你可以在紙上畫,也可以用EXCEL畫,甚至可以使用專業的軟體來畫。
  • 甘特圖在項目管理中的應用
    在項目管理中執行和追蹤尤為重要,需要人員的配合、控制,甚至有時需要跨部門協作,這時甘特圖起到尤為重要的作用。甘特圖包含了工作任務、負責人和起止時間幾個重要維度,可以讓項目團隊成員更好的把控整個項目流程。以前大多通過Excel繪製甘特圖,隨著科技發展傳統的工具無法滿足高效辦公的需求。
  • 新手如何用Excel製作甘特圖?詳細教程來了!
    總之,無論是使用excel,還是使用project,或者是其他工具,任務分解是第一步,學會分解任務,只有將任務分解得足夠細,你才能心裡有數,才能有條不紊地工作,才能統籌安排時間表 。任務分解之後,你可以使用excel來自定義你需要展示什麼信息。
  • 項目管理甘特圖是什麼?怎麼做才能更高效?(EXCEL甘特圖步驟)
    項目管理甘特圖是什麼?甘特圖即Gantt chart,又被稱之為橫道圖、條狀圖。其命名是由提出者亨利·L·甘特(Henrry L.Ganntt)先生的名字而來的。甘特圖是以圖示的方式,並通過活動列表和時間刻度,來形象地表示出某些特定項目的活動順序和持續時間。
  • 學會做一個簡單的甘特圖
    學會做一個簡單的甘特圖經常有人問甘特圖怎麼做,今天就來給大家分享如何做一個下方這樣的的甘特圖,如圖一。圖一甘特圖(Gantt chart)又稱為橫道圖、條狀圖(Bar chart)。以提出者亨利·L·甘特先生的名字命名。
  • 畫個甘特圖,管理項目進度
    下面這張就是甘特圖,從圖上可以很清楚地看到項目安排時間表,也可以用來管理多個並行開發的項目時間。為什麼叫甘特圖呢?這是因為他的發明者叫做亨利·勞倫斯·甘特(Henrry L. Ganntt)。甘特出生於一個貧窮的農民家庭,但他好學勤勞能幹,擅長圖表管理。
  • 技巧丨Project,Excel,PPT,三招搞定甘特圖!
    基本是一條線條圖,橫軸表示時間,縱軸表示活動(項目),線條表示在整個期間上計劃和實際的活動完成情況。它可以直觀地表明任務計劃在什麼時候進行,及實際進展與計劃要求的對比。管理者由此可便利地弄清一項任務(項目)還剩下哪些工作要做,並可評估工作進度。優點1. 圖形化概要,通用技術,易於理解。2.
  • 用Excel五分鐘出一張甘特圖,項目進度一目了然
    Excel是做項目必不可少的軟體,可行性分析和項目監控必不可少,今天就和大家說一下如果用Excel做出好看的甘特圖。不知道什麼是甘特圖?就是下面這個樣子:Step1 繪製一個基礎的堆積條形圖1.我們需要先準備好一張項目進度表:Tips:結束時間做甘特圖是用不到的,放在這裡是為了項目查看是方便2. 首先,我們需要把表頭中項目兩個字刪掉,然後選中中間三列數據。點擊插入-矩形圖標下三角-二維條形圖-中間那個。Tips:如果不刪除項目這兩個字,Excel會把開始時間也看作軸,後期調整會很麻煩3.
  • 甘特圖:項目管理計劃工具,職場裝B利器,項目管理的核心工具
    甘特圖:手把手教你做出高大上的計劃管理圖表,職場人士必備!清楚記得入職的第一天,老闆就直接給了一個小項目,規定一個月時間完成,需要我先做出一張計劃表給他看,我那時候還苦惱於用什麼方式呈現計劃表比較好,通過上網查詢,才發現有一個特別實用的,針對項目管理的計劃管理工具:甘特圖。
  • 我是如何通過甘特圖來管理項目進度的
    舉個簡單的例子,你就能明白甘特圖對於項目進度管理的作用。比如使用進度貓甘特圖管理年度的項目計劃,就是在一個平面坐標繫上,以橫軸為時間軸,單位為月,縱軸為項目軸,分別列出計劃完成的項目,在空白處填充空心的方框代表項目的進度,顯示每個項目的開始和結束時間,並對項目的進度情況進行控制的方法。
  • 推薦一個免費易用的項目管理軟體 GanttProject
    你好,歡迎來到PM網事,昨天咱們談到了敏捷適用於哪些項目,今天咱們一起來看一個簡單好用的項目管理軟體,GanttProject。在網際網路的項目環境裡,咱們對項目管理軟體經常會有下面這些要求:第1個要求:要能夠做進度管理,要簡單好用,不要像微軟的Project似的那麼複雜。第2個要求:要能夠跨平臺,因為網際網路行業用微軟、蘋果的系統比較多,所以一定要很好地支持這2個平臺。
  • 來來來,一起做甘特圖(用三種方式來製作)
    管理者由此可便利地弄清一項任務(項目)還剩下哪些工作要做,並可評估工作進度。甘特圖是基於作業排序的目的,將活動與時間聯繫起來的最早嘗試之一。該圖能幫助企業描述對諸如工作中心、超時工作等資源的使用圖。當用於負荷時,甘特圖可以顯示幾個部門、機器或設備的運行和閒置情況。這表示了該系統的有關工作負荷狀況,這樣可使管理人員了解何種調整是恰當的。
  • 甘特圖:最常用的項目管理工具模型(小白也要懂的工具模型3)
    作為使用範圍最廣的項目管理工具模型,甘特圖應該不用再做過多的介紹了吧,簡單來說就是學習一小時,受用一輩子!第二次世界大戰前夕, 甘特圖已成為計劃和控制軍事工程與建設項目的重要工具,時至今日仍是管理項目的常用方法。
  • 如何七周成為數據分析師:Excel技巧之甘特圖繪製(項目管理)
    (甘特圖是項目管理的一種工具,是拆分任務並將其進程可視化)平時大家利用Excel繪製的甘特圖可能是這個樣子的:如果忽略掉這種八十時代的設計風格,這個甘特圖勉勉強強能使用啦,至少完成了最原始的需求。不過當要進行的項目足夠大的時候。靠這種填充顏色來管理好項目那是不可能的,一點微小的調整都足夠手忙腳亂。