如何使用matplotlib绘制甘特图

9
我收到了一些数据,如下所示:
a0:86:c6:52:4e:e8,0.006568,0.006620,Out
a0:86:c6:52:4e:e8,0.006663,0.006695,In
a0:86:c6:52:4e:e8,0.008089,0.008141,Out
a0:86:c6:52:4e:e8,0.008185,0.008217,In
01:00:5e:00:00:fb,0.033096,0.035016,Out
33:33:00:00:00:fb,0.034997,0.037077,Out
01:00:5e:7f:ff:fa,0.039969,0.042057,Out
ff:ff:ff:ff:ff:ff,0.059823,0.061639,Out
a0:86:c6:52:4e:e8,0.068865,0.068917,Out
a0:86:c6:52:4e:e8,0.068962,0.068994,In
a0:86:c6:52:4e:e8,0.083492,0.083544,Out
a0:86:c6:52:4e:e8,0.083588,0.083620,In
...

实际上,它持续120秒。我希望使用 matplotlib 将这些数据制成类似甘特图的图表。

原因是大多数甘特图 API 仅支持时间格式为YY-MM-DD HH:MM:SS,而不支持微秒级别。

请告诉我如何操作?


您的数据中有4列。不清楚它们在图表中应该如何排列。请通过[编辑]您的问题来添加信息。 - ImportanceOfBeingErnest
实际上,在甘特图中,列名可以分别为任务开始完成资源 - user6546633
1个回答

25
为了在matplotlib中生成甘特图,可以使用plt.broken_barh函数。matplotlib页面上有一个broken_barh示例
为了过滤和分组数据,可以使用pandas,尤其是dataframe的groupby函数。
以下是完整示例:
inp = u"""a0:86:c6:52:4e:e8,0.006568,0.006620,Out
a0:86:c6:52:4e:e8,0.006663,0.006695,In
a0:86:c6:52:4e:e8,0.008089,0.008141,Out
a0:86:c6:52:4e:e8,0.008185,0.008217,In
01:00:5e:00:00:fb,0.033096,0.035016,Out
33:33:00:00:00:fb,0.034997,0.037077,Out
01:00:5e:7f:ff:fa,0.039969,0.042057,Out
ff:ff:ff:ff:ff:ff,0.059823,0.061639,Out
a0:86:c6:52:4e:e8,0.068865,0.068917,Out
a0:86:c6:52:4e:e8,0.068962,0.068994,In
a0:86:c6:52:4e:e8,0.083492,0.083544,Out
a0:86:c6:52:4e:e8,0.083588,0.083620,In"""

import pandas as pd
import io
import matplotlib.pyplot as plt

df = pd.read_csv(io.StringIO(inp), header=None, names=["Task", "Start", "Finish", "Resource"] )
df["Diff"] = df.Finish - df.Start

color = {"In":"turquoise", "Out":"crimson"}
fig,ax=plt.subplots(figsize=(6,3))

labels=[]
for i, task in enumerate(df.groupby("Task")):
    labels.append(task[0])
    for r in task[1].groupby("Resource"):
        data = r[1][["Start", "Diff"]]
        ax.broken_barh(data.values, (i-0.4,0.8), color=color[r[0]] )

ax.set_yticks(range(len(labels)))
ax.set_yticklabels(labels) 
ax.set_xlabel("time [ms]")
plt.tight_layout()       
plt.show()

它生成以下绘图:

enter image description here


谢谢!这非常有帮助。如果要在分组后更改y轴上对象的顺序,应该如何操作?这对我的项目非常重要。 - crusher083

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接