
import matplotlib.pyplot as pltimport matplotlib.dates as mdatesfrom datetime import datetime# 任务数据:[任务名, 开始日期, 结束日期]tasks = [['需求调研', '2026-01-20', '2026-01-24'],['系统设计', '2026-01-25', '2026-01-28'],['开发编码', '2026-01-29', '2026-02-05'],['测试阶段', '2026-02-06', '2026-02-08'],['上线部署', '2026-02-09', '2026-02-10']]# 解析日期task_names = []starts = []ends = []for name, s, e in tasks:starts.append(datetime.strptime(s, '%Y-%m-%d'))ends.append(datetime.strptime(e, '%Y-%m-%d'))task_names.append(name)# 获取所有分界日期(去重 + 排序)boundary_dates = sorted(set(starts + ends))# 绘图plt.figure(figsize=(10, 5))durations = [e - s for s, e in zip(starts, ends)]plt.barh(task_names, durations, left=starts, height=0.5, color='steelblue')# 设置 x 轴:只在分界处显示 YYYY-MM-DDax = plt.gca()ax.set_xticks(boundary_dates) # 只在这些位置放刻度ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) # 格式化plt.xticks(rotation=45, ha='right') # 倾斜避免重叠# 其他美化plt.xlabel('日期')plt.ylabel('任务')plt.title('甘特图')plt.grid(axis='x', linestyle='--', alpha=0.7)plt.tight_layout()plt.show()
tasks = [['需求调研', '2026-01-20', '2026-01-24'],['系统设计', '2026-01-25', '2026-01-28'],['开发编码', '2026-01-29', '2026-02-05'],['测试阶段', '2026-02-06', '2026-02-08'],['上线部署', '2026-02-09', '2026-02-10']]
starts.append(datetime.strptime(s, '%Y-%m-%d'))ends.append(datetime.strptime(e, '%Y-%m-%d'))
datetime.strptime 将字符串转为 datetime 对象。barh 和日期格式化器需要可计算的时间对象(支持加减、比较、绘图等)boundary_dates = sorted(set(starts + ends))plt.barh(task_names, durations, left=starts, height=0.5, color='steelblue')barh(y, width, left=...) 是绘制水平条形图的关键函数。y:Y 轴位置(这里是任务名,自动映射为 0,1,2...)width:条形宽度(即任务持续时间 durations)left:条形的左边界(即任务开始时间 starts)ax.set_xticks(boundary_dates)ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
set_xticks:手动指定 X 轴刻度位置(即前面提取的边界日期)。DateFormatter:将 datetime 对象格式化为 'YYYY-MM-DD' 字符串显示。plt.xticks(rotation=45, ha='right') # 倾斜标签防重叠plt.grid(axis='x', linestyle='--', alpha=0.7) # 纵向辅助线plt.tight_layout() # 自动调整边距
细数那些经典教材(编程、数据结构与算法相关)
推荐文章