中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何使用Matplotlib繪制甘特圖

發布時間:2021-12-17 12:27:03 來源:億速云 閱讀:520 作者:小新 欄目:開發技術

小編給大家分享一下Python如何使用Matplotlib繪制甘特圖,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

1.引言

甘特圖已經擁有 100 多年的歷史,這種可視化圖表對項目管理非常有用。

Python如何使用Matplotlib繪制甘特圖

Henry Gantt 為了分析已經完成的項目創建了甘特圖,他最初設計這個可視化工具主要用來衡量員工的工作效率并從中識別表現不佳的員工。經過多年的發展,甘特圖已經發展成項目規劃和跟蹤的必備工具。

本文主要介紹如何使用Matplotlib來繪制甘特圖,并不斷優化我們的可視化效果。

閑話少說,我們直接開始吧。 :)

2.舉個栗子

首先我們導入Pandas和Numpy庫,這兩個庫可以幫助我們進行數據預處理。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

為了舉例,這里采用一個項目管理的數據集,如下所示為對應的讀取代碼:

df = pd.read_excel('../data/plan.xlsx')
df

結果如下:

Python如何使用Matplotlib繪制甘特圖

上圖所示,我們一共有14個Task,從TaskA到TaskM。其中每一行依次表示編號,Task名字,Task所屬部門,Task開始日期,Task結束日期,以及已經完成了多少。

3.數據預處理

為了使我們的繪圖變得更加容易,我們需要增加一些變量。
首先我們需要設置整個項目開始日期,接著,我們將添加一列,用于表示從項目開始日期到每個子任務開始的天數;這將有助于在 x 方向上定位每個子任務的位置。

同理,我們對從項目開始日期到子任務結束的天數也增加一列,這將有助于計算完成子任務所需的總的天數。

編寫代碼如下:

# project start date
proj_start = df.Start.min()
# number of days from project start to task start
df['start_num'] = (df.Start - proj_start).dt.days
# number of days from project start to end of tasks
df['end_num'] = (df.End - proj_start).dt.days
# days between start and end of each task
df['days_start_to_end'] = df.end_num - df.start_num

運行結果如下:

Python如何使用Matplotlib繪制甘特圖

如上圖所示,我們設置整個項目的開始日期為2022-02-15,我們增加了3列,依次為start_num用于表示子任務開始日期到整個項目開始日期的天數,end_num用于表示子任務結束日期到整個項目開始日期的天數,days_start_to_end用于表示完成子任務所需要的天數。

4.繪制甘特圖

做好上述準備,我們就可以繪制我們的甘特圖了。這里我們使用Matplotlib中的條形圖進行繪制。
Y軸表示任務名稱,每個子項的寬度表示子任務開始和結束之間的天數,子項的起始位置為從項目開始到子任務開始之間的天數。
繪制代碼如下:

fig, ax = plt.subplots(1, figsize=(16,6))
ax.barh(df.Task, df.days_start_to_end, left=df.start_num)
plt.show()

運行結果如下:

Python如何使用Matplotlib繪制甘特圖

5.添加顏色

觀察上圖,我們繪制了最簡單的條形圖用來表示項目管理。但是太粗糙了,接著我們來一步一步進行改進吧。。。
首先我們觀察上圖,條形圖中的子項都是同一顏色,區分度不明顯,但是我們數據中每項任務都有歸屬部門,我們可以對不同部門設置不同顏色。代碼如下:

# create a column with the color for each department
def color(row):
    c_dict = {'MKT':'#E64646', 'FIN':'#E69646', 'ENG':'#34D05C', 'PROD':'#34D0C3', 'IT':'#3475D0'}
    return c_dict[row['Department']]
df['color'] = df.apply(color, axis=1)

同時我們觀察到上圖中x軸為數字,所代表的含義并不直觀,我們將其轉化為日期每隔三天進行一次顯示。這樣我們優化后x軸日期顯示代碼如下:

from matplotlib.patches import Patch
fig, ax = plt.subplots(1, figsize=(16,6))
ax.barh(df.Task, df.days_start_to_end, left=df.start_num, color=df.color)
##### LEGENDS #####
c_dict = {'MKT':'#E64646', 'FIN':'#E69646', 'ENG':'#34D05C',
          'PROD':'#34D0C3', 'IT':'#3475D0'}
legend_elements = [Patch(facecolor=c_dict[i], label=i)  for i in c_dict]
plt.legend(handles=legend_elements)
##### TICKS #####
xticks = np.arange(0, df.end_num.max()+1, 3)
xticks_labels = pd.date_range(proj_start, end=df.End.max()).strftime("%m/%d")
xticks_minor = np.arange(0, df.end_num.max()+1, 1)
ax.set_xticks(xticks)
ax.set_xticks(xticks_minor, minor=True)
ax.set_xticklabels(xticks_labels[::3])
plt.show()

運行結果如下:

Python如何使用Matplotlib繪制甘特圖

6.添加透明度

仔細觀察上圖,是不是比第一版美觀很多。我們觀察我們的數據,發現我們還有一列Completeness沒有進行可視化,我們知道它代表每項子任務的完成度。接著我們來對齊進行可視化。

# days between start and current progression of each task
df['current_num'] = (df.days_start_to_end * df.Completion)

我們將新創建一個條形圖,子項為上述每項子任務的完成度。同時我們將在子項的末尾寫上完成度的百分比。

為了區分已完成和未完成,我們可以使用參數alpha將未完成部分設置成透明效果。

代碼如下:

from matplotlib.patches import Patch
fig, ax = plt.subplots(1, figsize=(16,6))
# bars
ax.barh(df.Task, df.current_num, left=df.start_num, color=df.color)
ax.barh(df.Task, df.days_start_to_end, left=df.start_num, color=df.color, alpha=0.5)
# texts
for idx, row in df.iterrows():
    ax.text(row.end_num+0.1, idx, 
            f"{int(row.Completion*100)}%", 
            va='center', alpha=0.8)
##### LEGENDS #####
c_dict = {'MKT':'#E64646', 'FIN':'#E69646', 'ENG':'#34D05C', 'PROD':'#34D0C3', 'IT':'#3475D0'}
legend_elements = [Patch(facecolor=c_dict[i], label=i)  for i in c_dict]
plt.legend(handles=legend_elements)
##### TICKS #####
xticks = np.arange(0, df.end_num.max()+1, 3)
xticks_labels = pd.date_range(proj_start, end=df.End.max()).strftime("%m/%d")
xticks_minor = np.arange(0, df.end_num.max()+1, 1)
ax.set_xticks(xticks)
ax.set_xticks(xticks_minor, minor=True)
ax.set_xticklabels(xticks_labels[::3])
plt.show()

運行結果如下:

Python如何使用Matplotlib繪制甘特圖

7.再優化

最后,為了讓我們的甘特圖更具有吸引力。我們可以繪制網格線,添加我們的標題說明圖表用途。

代碼較長,不在粘貼。后文有完整代碼獲取方式。

最后的可視化結果如下:

Python如何使用Matplotlib繪制甘特圖

當然也可以設置背景色,以突出前景條目。效果如下所示:

Python如何使用Matplotlib繪制甘特圖

看完了這篇文章,相信你對“Python如何使用Matplotlib繪制甘特圖”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

星子县| 梅河口市| 阿尔山市| 翁源县| 威海市| 台北县| 丰顺县| 永定县| 镇原县| 托克托县| 平南县| 景谷| 磐石市| 扎鲁特旗| 怀化市| 广汉市| 苗栗县| 四子王旗| 内丘县| 天镇县| 中阳县| 山丹县| 云龙县| 凤凰县| 全椒县| 塘沽区| 纳雍县| 潜江市| 明水县| 乃东县| 金寨县| 拉孜县| 辽宁省| 龙州县| 兰州市| 伊吾县| 分宜县| 瓮安县| 禄劝| 二连浩特市| 赤水市|