2017-04-12 35 views
4

得到甘特情節我有一些像數據:如何使用matplotlib

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,而不是如此小(微秒)的大小。

請告訴我該怎麼做?

+0

最甘特圖僅API支持時間格式YY-MM-DD HH:MM:SS,而不是如此小(微秒)的大小。那我該如何解決呢? –

+0

您的數據中有4列。目前還不清楚他們應該如何安排在圖表中。請通過[編輯]您的問題添加信息。 – ImportanceOfBeingErnest

+0

其實,列名可以是**任務**,**開始**,**完成**,**資源**單獨在*甘特圖*。 –

回答

7

爲了在matplotlib中生成甘特圖,可以使用plt.broken_barh函數。 Matplotlib頁面上有a broken_barh example

爲了對數據進行過濾和分組,可以使用熊貓,特別是數據幀的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