欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python使用Matplotlib繪制甘特圖的實踐

 更新時間:2021年12月17日 10:15:04   作者:趙卓不凡  
甘特圖已經(jīng)發(fā)展成項目規(guī)劃和跟蹤的必備工具,本文主要介紹了Python使用Matplotlib繪制甘特圖的實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

1.引言

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

在這里插入圖片描述

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

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

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

2.舉個栗子

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

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

為了舉例,這里采用一個項目管理的數(shù)據(jù)集,如下所示為對應(yīng)的讀取代碼:

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

結(jié)果如下:

在這里插入圖片描述

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

3.數(shù)據(jù)預(yù)處理

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

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

編寫代碼如下:

# 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

運行結(jié)果如下:

在這里插入圖片描述

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

4.繪制甘特圖

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

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

運行結(jié)果如下:

在這里插入圖片描述

5.添加顏色

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

# 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軸為數(shù)字,所代表的含義并不直觀,我們將其轉(zhuǎn)化為日期每隔三天進行一次顯示。這樣我們優(yōu)化后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()

運行結(jié)果如下:

在這里插入圖片描述

6.添加透明度

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

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

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

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

代碼如下:

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()

運行結(jié)果如下:

在這里插入圖片描述

7.再優(yōu)化

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

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

最后的可視化結(jié)果如下:

在這里插入圖片描述

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

在這里插入圖片描述

Wow,果真逼格滿滿。。。。

8. 總結(jié)

本文介紹了如何用Matplotlib使用條形圖繪制甘特圖來進行項目管理可視化,并不斷改進以提升最終顯示效果。

到此這篇關(guān)于Python使用Matplotlib繪制甘特圖的實踐的文章就介紹到這了,更多相關(guān)Matplotlib 甘特圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pandas中df.rename()的具體使用

    pandas中df.rename()的具體使用

    本文主要介紹了pandas中df.rename()的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • Python小白必備的8個最常用的內(nèi)置函數(shù)(推薦)

    Python小白必備的8個最常用的內(nèi)置函數(shù)(推薦)

    這篇文章主要介紹了Python常用的內(nèi)置函數(shù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Python實現(xiàn)切割mp3片段并降低碼率

    Python實現(xiàn)切割mp3片段并降低碼率

    MoviePy是一個基于Python的視頻編輯庫,它提供了創(chuàng)建、編輯、合并、剪輯和轉(zhuǎn)換視頻的功能,所以本文主要介紹如何使用moviepy來分割音頻流并降低碼率,感興趣的可以了解下
    2023-08-08
  • Python+matplotlib實現(xiàn)繪制等高線圖示例詳解

    Python+matplotlib實現(xiàn)繪制等高線圖示例詳解

    在matplotlib.pyplot中除了可以繪制常規(guī)圖表如折線、柱狀、散點等,還可以繪制常用在地理上的平面展示地型的等高線圖,本文主要為大家介紹了如何利用matplotlib繪制等高線圖,需要的可以參考一下
    2021-12-12
  • 學習python 之編寫簡單乘法運算題

    學習python 之編寫簡單乘法運算題

    這篇文章主要介紹了學習python 第一季 編寫簡單乘法運算題,需要的朋友可以參考下
    2016-02-02
  • 一文搞懂Pandas數(shù)據(jù)透視的4個函數(shù)的使用

    一文搞懂Pandas數(shù)據(jù)透視的4個函數(shù)的使用

    今天主要和大家分享Pandas中四種有關(guān)數(shù)據(jù)透視的通用函數(shù),在數(shù)據(jù)處理中遇到這類需求時,能夠很好地應(yīng)對,快跟隨小編一起學習一下吧
    2022-06-06
  • Python2和3字符編碼的區(qū)別知識點整理

    Python2和3字符編碼的區(qū)別知識點整理

    在本篇文章中小編給各位分享的是關(guān)于Python2和3字符編碼的區(qū)別知識點,有需要的朋友們可以學習下。
    2019-08-08
  • 代碼實例講解python3的編碼問題

    代碼實例講解python3的編碼問題

    在本篇內(nèi)容里小編給各位分享了關(guān)于python3的編碼問題以及相關(guān)實例代碼,有需要的朋友們參考一下。
    2019-07-07
  • Python 實現(xiàn)OpenCV格式和PIL.Image格式互轉(zhuǎn)

    Python 實現(xiàn)OpenCV格式和PIL.Image格式互轉(zhuǎn)

    今天小編就為大家分享一篇Python 實現(xiàn)OpenCV格式和PIL.Image格式互轉(zhuǎn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python拼接字符串的7種方法總結(jié)

    Python拼接字符串的7種方法總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于Python拼接字符串的7種方法,分別是來自C語言的%方式、format()拼接方式、() 類似元組方式、面向?qū)ο竽0迤唇?、join()拼接方式以及f-string方式,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-11-11

最新評論