用python绘制一个甘特图
绘制甘特图,这事儿听起来挺复杂的,但其实只要理清思路,一步步来,就能慢慢把它搞定了。
一开始,我的想法是,甘特图不就是时间轴上的一堆活动嘛,每个活动都有开始时间和结束时间。如果我能把这些活动按照时间顺序排列起来,不就成了甘特图的一部分了吗?
我先试着用最简单的方式来表示这些活动,就是用一些简单的数据结构,比如字典或者列表。我创建了一个列表,每个元素都是一个字典,里面包含了活动名称、开始时间、结束时间和颜色。这样,我就可以用代码来操作这些信息了。
然后,我想到了用barh图来表示每个活动的持续时间。barh图可以很好地展示持续时间,而且垂直排列的条形图也符合甘特图的展示习惯。我用matplotlib的barh函数,给每个活动分配了一个barh,用颜色来区分不同的活动。
但是,我遇到了一个问题,就是如何让这些活动在时间轴上正确排列。我尝试用设置ax.set_yticks和ax.set_yticklabels来调整y轴的刻度和标签,但感觉效果不是很理想。我需要一个更精细的控制,让每个活动都能在正确的位置上。
我想到,maybe我可以用一个变量来记录每个活动的位置,然后每次绘制活动的时候,都把这个变量加一,这样活动就能依次排列了。我试了一下,这种方法效果不错,活动按照时间顺序排列得很好。
接下来,我想到了如何让甘特图更美观。我用ax.axvline来添加一条垂直线来表示当前时间,这样用户就能一眼看出哪些活动已经完成,哪些正在进行,哪些还没开始。我还调整了图表的大小,让整个甘特图看起来更协调。
在这个过程中,我也有过几次思路的调整。比如,我最初是想用散点图来表示活动的开始和结束时间,但后来发现barh图更合适。还有,我在设置y轴的时候也尝试过其他方法,但最终还是觉得用ax.set_yticks和ax.set_yticklabels来调整是最直观的。
最后,我把这些想法都实现了,生成了一个看起来不错的甘特图。我检查了一下,活动的开始和结束时间都正确,位置也都排列得当,颜色也区分得很好。我甚至还用plt.show()来显示图表,确认一切都符合我的预期。
通过这个过程,我觉得自己对甘特图的绘制有了更深的理解。虽然遇到了一些问题,但通过不断的尝试和调整,我最终还是找到了解决问题的方法。这个过程虽然有些曲折,但每次解决问题后,我都感到一种小小的成就感。
在 Python 中,可以使用 Matplotlib 或 Plotly 绘制甘特图。甘特图常用于展示项目任务的时间安排,以下是一个用 Matplotlib 绘制甘特图的示例代码:
示例:用 Matplotlib 绘制甘特图
Python复制
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
示例数据:任务名称、开始时间、结束时间和颜色
data = {
‘Task’: [‘Task A’, ‘Task B’, ‘Task C’, ‘Task D’],
‘Start’: [‘2024-01-01’, ‘2024-01-03’, ‘2024-01-06’, ‘2024-01-08’],
‘End’: [‘2024-01-04’, ‘2024-01-07’, ‘2024-01-10’, ‘2024-01-12’],
‘Color’: [‘skyblue’, ‘orange’, ‘lightgreen’, ‘pink’]
}
转换为 DataFrame
df = pd.DataFrame(data)
df[‘Start’] = pd.to_datetime(df[‘Start’])
df[‘End’] = pd.to_datetime(df[‘End’])
绘制甘特图
fig, ax = plt.subplots(figsize=(10, 6))
设置时间刻度格式
ax.xaxis_date()
ax.xaxis.set_major_formatter(mdates.DateFormatter(‘%Y-%m-%d’))
绘制每个任务的条形图
for index, row in df.iterrows():
ax.barh(row[‘Task’], width=row[‘End’] - row[‘Start’], left=row[‘Start’], color=row[‘Color’], edgecolor=‘black’)
添加标签和标题
ax.set_xlabel(‘Date’)
ax.set_ylabel(‘Task’)
ax.set_title(‘Gantt Chart’)
调整布局
plt.tight_layout()
显示图表
plt.show()
示例:用 Plotly 绘制甘特图
Plotly 提供了更现代和交互式的图表,适合动态展示甘特图。
Python复制
import plotly.figure_factory as ff
import pandas as pd
示例数据:任务名称、开始时间、结束时间和资源
data = [
dict(Task=“Task A”, Start=‘2024-01-01’, Finish=‘2024-01-04’, Resource=‘Task A’),
dict(Task=“Task B”, Start=‘2024-01-03’, Finish=‘2024-01-07’, Resource=‘Task B’),
dict(Task=“Task C”, Start=‘2024-01-06’, Finish=‘2024-01-10’, Resource=‘Task C’),
dict(Task=“Task D”, Start=‘2024-01-08’, Finish=‘2024-01-12’, Resource=‘Task D’)
]
绘制甘特图
fig = ff.create_gantt(data, index_col=‘Resource’, title=‘Gantt Chart’, show_colorbar=True, bar_width=0.5, showgrid_x=True, showgrid_y=True)
显示图表
fig.show()
说明:
Matplotlib:适合简单的甘特图绘制,易于自定义样式。
Plotly:生成交互式图表,支持鼠标悬停查看详细信息。
如果需要更专业的甘特图,可以考虑使用专门的工具,如 tablib 或结合 Excel 自动化。
根据你的需求选择合适的工具!
更多推荐
所有评论(0)