甘特图是一种直观地用条形图形式展现项目计划的工具。以横轴代表时间,清晰展示项目从开始到结束的整个周期;纵轴代表任务列表,列出项目中所有需要完成的工作项;条形块代表任务,每个任务的位置表示开始和结束时间,长度表示任务耗时长短;连接线表示拓扑(依赖)关系,明确展示哪个任务完成后才能开始下一个任务(例如,必须先“设计完成”才能开始“开发”)。importmatplotlib.pyplotaspltdefmain():#项目关键节点project=["需求分析","初步设计","施工图设计","建造阶段","竣工验收","技术总结"]start_dates=[1,5,10,18,25,30]end_dates=[4,9,17,24,29,35]#实际完成情况actual_starts=[i+1foriinstart_dates]actual_ends=[i+1foriinend_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='计划')#实际时间线fori,idxinenumerate(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')#添加延迟标注fori,(plan,actual)inenumerate(zip(start_dates,actual_starts)):ifactual>plan:delay=actual-planax.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='lowerright')ax.grid(axis='x',alpha=0.3)#添加今日标记today=20ax.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()来源:数值分析与有限元编程