一篇文章教你学会使用Python绘制甘特图

  • Post category:Python

关于“一篇文章教你学会使用Python绘制甘特图”的实例教程,我来详细讲解一下。

一、甘特图介绍

甘特图是项目管理中常用的一种表现工具,用于显示项目进度和时间安排。甘特图通常被绘制成横向条形图形式,按时间轴从左到右显示项目每个任务的开始时间和结束时间。在此基础上,我们可以根据需求添加其他信息,使其变得更加直观清晰。

二、Python绘制甘特图的实现

Python是一种高级编程语言,它的强大功能可以让我们轻松地绘制甘特图。在Python中,我们可以使用Matplotlib库来实现绘制甘特图的功能。下面是一个简单的示例:

import matplotlib.pyplot as plt

fig, ax = plt.subplots()

# 添加任务
tasks = [
    {"label": "任务 1", "start": 1, "end": 4},
    {"label": "任务 2", "start": 4, "end": 12},
    {"label": "任务 3", "start": 10, "end": 16},
    {"label": "任务 4", "start": 13, "end": 20},
]

# 设置坐标轴
ax.set_xlim(0, 24)
ax.set_ylim(0, len(tasks) + 0.5)
ax.set_xlabel("时间")
ax.set_ylabel("任务")

# 绘制甘特图
for i, task in enumerate(tasks):
    ax.broken_barh([(task["start"], task["end"] - task["start"])],
                   (i + 0.1, 0.8),
                   facecolors=("tab:blue",))
    ax.text(task["start"], i + 0.5, task["label"])

plt.show()

在上面这个示例中,我们使用Matplotlib库绘制了一个简单的甘特图,包含了四个任务。每个任务都由起始时间和结束时间来定义,并被表示为横向条形图。通过调用broken_barh()函数,我们可以将任务转换为条形图形式,并使用facecolors参数指定其颜色。我们还可以使用text()函数在任务上方添加标签。

接下来,我们将展示如何将其扩展为更实用的甘特图。

三、绘制更完整的甘特图

接下来的示例演示了如何绘制更加实用的甘特图,并包含更多的样式和标注。

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime

fig, ax = plt.subplots()

# 添加任务
tasks = [
    {"label": "任务 1", "start": datetime(2021, 10, 1, 8, 0), "end": datetime(2021, 10, 1, 12, 0)},
    {"label": "任务 2", "start": datetime(2021, 10, 1, 12, 0), "end": datetime(2021, 10, 1, 18, 0)},
    {"label": "任务 3", "start": datetime(2021, 10, 2, 12, 0), "end": datetime(2021, 10, 3, 12, 0)},
    {"label": "任务 4", "start": datetime(2021, 10, 2, 10, 0), "end": datetime(2021, 10, 2, 16, 0)},
]

# 设置坐标轴
hours = mdates.HourLocator(interval=3)
h_fmt = mdates.DateFormatter('%H:%M')
ax.xaxis.set_major_locator(hours)
ax.xaxis.set_major_formatter(h_fmt)
ax.set_ylim(0, len(tasks) + 0.5)
ax.set_xlabel("时间")
ax.set_ylabel("任务")

# 绘制甘特图
for i, task in enumerate(tasks):
    ax.broken_barh([(task["start"], task["end"] - task["start"])],
                   (i + 0.1, 0.8),
                   facecolors=("tab:blue",))
    ax.text(task["start"], i + 0.5, task["label"])

plt.show()

在这个示例中,我们绘制了一个更实用的甘特图,它具有以下特点:

  1. 任务的开始和结束时间是通过datetime对象来定义的,这使得我们可以在精确到秒的级别上绘制甘特图;
  2. 我们使用了日期轴格式化,将时间轴刻度设置为每三小时一次;
  3. 每个条形图都自动添加了一个黑色的边框,这使得整个图的结构更加清晰。

四、总结

在本文中,我们使用Python的Matplotlib库来实现了一个示例,展示了如何通过代码绘制甘特图。在实例的过程中,我们学习了如何添加任务、样式和标注,以及如何处理时间信息。如果您需要绘制甘特图,希望这篇文章能够为您的工作提供帮助。