目錄
- 前言
- 1. matplotlib
- 2. plotly
前言
甘特圖是一種常見的項目管理工具,用于表示項目任務的時間進度
直觀地看到項目的各個任務在時間上的分布和進度
常用的繪制甘特圖的工具是 matplotlib 和 plotly
主要以Demo的形式展示
1. matplotlib
功能強大的繪圖庫,適合制作靜態的甘特圖
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates# 創建數據
tasks = [{"Task": "Task A", "Start": "2024-01-01", "End": "2024-01-05"},{"Task": "Task B", "Start": "2024-01-02", "End": "2024-01-07"},{"Task": "Task C", "Start": "2024-01-08", "End": "2024-01-10"},
]# 將數據轉換為 DataFrame
df = pd.DataFrame(tasks)# 轉換日期
df["Start"] = pd.to_datetime(df["Start"])
df["End"] = pd.to_datetime(df["End"])# 創建圖形和軸
fig, ax = plt.subplots(figsize=(10, 6))# 繪制條形圖
for index, row in df.iterrows():ax.barh(row["Task"], (row["End"] - row["Start"]).days, left=row["Start"], color="skyblue")# 設置日期格式
ax.xaxis.set_major_locator(mdates.DayLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))# 設置標題和標簽
plt.title("Gantt Chart")
plt.xlabel("Date")
plt.ylabel("Tasks")# 顯示圖形
plt.show()
截圖如下:
帶有不同顏色的甘特圖
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates# 創建數據
tasks = [{"Task": "Task A", "Start": "2024-01-01", "End": "2024-01-05", "Color": "skyblue"},{"Task": "Task B", "Start": "2024-01-02", "End": "2024-01-07", "Color": "lightgreen"},{"Task": "Task C", "Start": "2024-01-08", "End": "2024-01-10", "Color": "lightcoral"},
]# 將數據轉換為 DataFrame
df = pd.DataFrame(tasks)# 轉換日期
df["Start"] = pd.to_datetime(df["Start"])
df["End"] = pd.to_datetime(df["End"])# 創建圖形和軸
fig, ax = plt.subplots(figsize=(10, 6))# 繪制條形圖
for index, row in df.iterrows():ax.barh(row["Task"], (row["End"] - row["Start"]).days, left=row["Start"], color=row["Color"])# 設置日期格式
ax.xaxis.set_major_locator(mdates.DayLocator(interval=1))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))# 設置標題和標簽
plt.title("Gantt Chart with Different Colors")
plt.xlabel("Date")
plt.ylabel("Tasks")# 顯示圖形
plt.show()
截圖如下:
2. plotly
交互式繪圖庫,適合制作動態甘特圖
import plotly.express as px
import pandas as pd# 創建數據
tasks = [{"Task": "Task A", "Start": "2024-01-01", "Finish": "2024-01-05"},{"Task": "Task B", "Start": "2024-01-02", "Finish": "2024-01-07"},{"Task": "Task C", "Start": "2024-01-08", "Finish": "2024-01-10"},
]# 將數據轉換為 DataFrame
df = pd.DataFrame(tasks)# 使用 plotly 繪制甘特圖
fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task", title="Gantt Chart")
fig.update_yaxes(categoryorder="total ascending")# 顯示圖形
fig.show()
截圖如下:
帶有任務分組的甘特圖
import plotly.express as px
import pandas as pd# 創建數據
tasks = [{"Task": "Task A1", "Start": "2024-01-01", "Finish": "2024-01-05", "Group": "Group A"},{"Task": "Task A2", "Start": "2024-01-06", "Finish": "2024-01-10", "Group": "Group A"},{"Task": "Task B1", "Start": "2024-01-02", "Finish": "2024-01-07", "Group": "Group B"},{"Task": "Task B2", "Start": "2024-01-08", "Finish": "2024-01-12", "Group": "Group B"},
]# 將數據轉換為 DataFrame
df = pd.DataFrame(tasks)# 使用 plotly 繪制甘特圖
fig = px.timeline(df, x_start="Start", x_end="Finish", y="Task", color="Group", title="Gantt Chart with Groups")
fig.update_yaxes(categoryorder="total ascending")# 顯示圖形
fig.show()
截圖如下: