【发布时间】:2017-02-02 13:04:30
【问题描述】:
我在尝试使用 python 从数据集中绘制甘特图时遇到了一些麻烦。我有一组机器在一段时间内处理不同的任务。我想制作一个甘特图,以 y 轴显示机器,x 轴显示每项任务所花费的时间。 每台机器应该在 y 轴上只出现一次,以便更容易看到我希望每个任务使用相同颜色的任务。
这个想法是检查奇怪的事情,例如两台或多台机器一起处理相同的任务。
让我通过一个小例子来展示我拥有的数据集:
machine equipment start finish
m1 e2 date1 date2
m2 e2 date3 date4
m1 e1 date5 date6
m3 e3 date7 date8
m3 e4 date9 date10
我尝试使用 matplotlib 中的 broken_barh,但我无法找到有效地为绘图添加数据的方法。因为我有 100 台机器和 400 个任务。
Here is a picture 显示输出应该是什么样子。
当前代码如下:
import datetime as dt
machines = set(list(mydata["machine"]))
tasks = set(list(mydata["task"]))
fig, ax = plt.subplots(figsize=(20, 10))
yrange = 5 # y width of gantt bar
ymin = 0
orign = min(list(mydata["start"])) # time origin
for i in machines:
stdur = [] # list of tuples (start, duration)
ymin = index*6 # start y of gantt bar
for index, row in mydata.iterrows():
if row["machine"] == i:
start = (row["start"] - orign).total_seconds()/3600
duration = (row["finish"] - row["start"]).total_seconds()/3600
stdur.append((start,duration))
ax.broken_barh(stdur,(ymin,yrange))
ax.set_xlabel('Time')
ax.set_yticklabels(machines)
plt.show()
【问题讨论】:
-
效率是什么意思? 100*400 对于计算效率来说并不多。
-
实际上数据集有大约 2000 行。我一直天真地循环所有这些以合并不同机器和任务的列表,这将需要很长时间。
-
听起来还是可行的。我认为如果您不显示您的代码/提供更多信息究竟是什么问题(例如预处理或最终 plt.plot() 调用),没有太多帮助。
-
好点。我将编辑问题
标签: python matplotlib job-scheduling gantt-chart