甘特圖又稱為橫道圖、條狀圖,它是以作業排序為目的,將活動與時間聯系起來的最早嘗試的工具之一,能夠很直觀地顯示項目、進度等和時間的內在關系隨著時間的進展情況,在管理和生產活動中被廣泛使用。
用來制作甘特圖的專業工具也不少,常見的有: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.不適用于時間依賴關系過復雜的場景,否則將大大提高讀圖成本。
-
編程語言
+關注
關注
10文章
1949瀏覽量
34890 -
瀏覽器
+關注
關注
1文章
1034瀏覽量
35447 -
python
+關注
關注
56文章
4806瀏覽量
84931
發布評論請先 登錄
相關推薦
評論