甘特图是一种直观地用条形图形式展现项目计划的工具。以横轴代表时间,清晰展示项目从开始到结束的整个周期;纵轴代表任务列表,列出项目中所有需要完成的工作项;条形块代表任务,每个任务的位置表示开始和结束时间,长度表示任务耗时长短;连接线表示拓扑(依赖)关系,明确展示哪个任务完成后才能开始下一个任务(例如,必须先“设计完成”才能开始“开发”)。 import matplotlib.pyplot as pltdefmain(): # 项目关键节点 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( ) 来源:数值分析与有限元编程