当前位置:首页>python>Python编程小技巧--‌甘特图

Python编程小技巧--‌甘特图

  • 2026-09-25 11:27:15
Python编程小技巧--‌甘特图
甘特图(Gantt Chart)常用于项目管理,用来展示任务的开始时间、结束时间和持续时间。
在 Python 中,我们可以利用 matplotlib 绘图库来画一个简单的甘特图,效果大概如下,可以清晰地看到每个项目的进度安排情况,还是比较直观的。
代码如下(可直接运行,效果如上图,如遇到报错可以评论区留言或者私信)。通常只需要调整第6行的tasks就可以定制你自己的甘特图了。
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()
部分核心原理如下

1. 数据准备

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']]
  • 每个任务包含:名称、开始日期、结束日期(字符串格式)。

2. 日期解析(字符串 → datetime 对象)

starts.append(datetime.strptime(s, '%Y-%m-%d'))ends.append(datetime.strptime(e, '%Y-%m-%d'))
  • 使用 datetime.strptime 将字符串转为 datetime 对象。
  • 因为 Matplotlib 的 barh 和日期格式化器需要可计算的时间对象(支持加减、比较、绘图等)

3. 提取边界日期(用于 X 轴刻度)

boundary_dates = sorted(set(starts + ends))
  • 合并所有开始和结束日期,去重并排序。
  • 只在任务的起止点显示 X 轴刻度,避免杂乱,提升可读性。

4. 绘制水平条形图(核心绘图逻辑)

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)

5. X 轴日期格式化

ax.set_xticks(boundary_dates)ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
  • set_xticks:手动指定 X 轴刻度位置(即前面提取的边界日期)。
  • DateFormatter:将 datetime 对象格式化为 'YYYY-MM-DD' 字符串显示。
  • 效果:X 轴只在任务切换点标注日期,干净清晰。

6. 美化与布局

plt.xticks(rotation=45, ha='right')  # 倾斜标签防重叠plt.grid(axis='x', linestyle='--', alpha=0.7)  # 纵向辅助线plt.tight_layout()  # 自动调整边距


推荐合集

推荐文章

最新文章

随机文章