甘特图是一种直观地用条形图形式展现项目计划的工具。以横轴代表时间,清晰展示项目从开始到结束的整个周期;纵轴代表任务列表,列出项目中所有需要完成的工作项;条形块代表任务,每个任务的位置表示开始和结束时间,长度表示任务耗时长短;连接线表示拓扑(依赖)关系,明确展示哪个任务完成后才能开始下一个任务(例如,必须先“设计完成”才能开始“开发”)。
import matplotlib.pyplot as plt
defmain():
# 项目关键节点
project = ["需求分析",
"初步设计",
"施工图设计",
"建造阶段",
"竣工验收",
"技术总结"]
start_dates = [1, 5, 10, 18, 25, 30]
end_dates = [4, 9, 17, 24, 29, 35]
# 实际完成情况
actual_starts = [i+1for i in start_dates]
actual_ends = [i+1for i in end_dates]
# 创建甘特图
fig, ax = plt.subplots(figsize=(12, 6))
plt.rcParams['font.sans-serif'] = ['MiSans'] #这个字体能够支持中英文字符plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 计划时间线
ax.hlines(y=project, xmin=start_dates, xmax=end_dates,
color='blue', linewidth=8, alpha=0.5, label='计划')
# 实际时间线
for i, idx inenumerate(project):
# 使用step绘制水平阶梯图
ax.step([actual_starts[i], actual_ends[i]],
[idx,idx],
where = 'mid', color = 'red', linewidth = 3)
# 添加实际开始和结束标记
ax.plot(actual_starts[i], idx, '>',
markersize=10, color='darkred')
ax.plot(actual_ends[i], idx, '|',
markersize=12, color='darkred')
# 添加延迟标注
for i, (plan, actual) inenumerate(zip(start_dates, actual_starts)):
if actual > plan:
delay = actual - plan
ax.annotate(f'+{delay}天',
xy=(actual_ends[i], project[i]),
xytext=(actual_ends[i]+1, project[i]),
arrowprops=dict(arrowstyle='->', color='red'),
color='black', fontweight='bold')
# 设置标题和标签
ax.set_title('项目进度计划图', fontsize=18)
ax.set_xlabel('时间轴', fontsize=13)
ax.set_ylabel('关键节点', fontsize=13)
# 添加图例和网格
ax.legend(['计划进度', '实际进度'], loc='lower right')
ax.grid(axis='x', alpha=0.3)
# 添加今日标记
today = 20
ax.axvline(today, color='green', linestyle='--', alpha=0.7)
ax.text(today+0.2, project[0], '今日',
rotation=90, va='bottom', color='green')
plt.tight_layout()
fig.savefig("项目进度计划图.png", dpi=300)
plt.show()
if __name__ == "__main__":
main( )
