tl; dr:如何在繪製時間序列時跳過沒有數據的時間段?matplotlib:跳過不帶數據的時間段繪製時間序列
我正在運行一個長計算,我想監視它的進度。有時我打斷這個計算。日誌存儲在一個巨大的CSV文件中,如下所示:
2016-01-03T01:36:30.958199,0,0,0,startup
2016-01-03T01:36:32.363749,10000,0,0,regular
...
2016-01-03T11:12:21.082301,51020000,13402105,5749367,regular
2016-01-03T11:12:29.065687,51030000,13404142,5749367,regular
2016-01-03T11:12:37.657022,51040000,13408882,5749367,regular
2016-01-03T11:12:54.236950,51050000,13412824,5749375,shutdown
2016-01-03T19:02:38.293681,51050000,13412824,5749375,startup
2016-01-03T19:02:49.296161,51060000,13419181,5749377,regular
2016-01-03T19:03:00.547644,51070000,13423127,5749433,regular
2016-01-03T19:03:05.599515,51080000,13427189,5750183,regular
...
實際上,有41列。每一列都是進展的一個指標。第二列總是以10000步爲單位遞增。最後一列是不言自明的。
我想繪製每個列在同一個圖上,同時跳過「關機」和「啓動」之間的時間段。理想情況下,我還想在每個跳過時畫一條垂直線。
這裏是我到目前爲止有:
import matplotlib.pyplot as plt
import pandas as pd
# < ... reading my CSV in a Pandas dataframe `df` ... >
fig, ax = plt.subplots()
for col in ['total'] + ['%02d' % i for i in range(40)]:
ax.plot_date(df.index.values, df[col].values, '-')
fig.autofmt_xdate()
plt.show()
我想擺脫那個長平時期的,只是畫一條垂直線來代替。
我知道df.plot()
,但在我的經驗,它的分解(除其他事項外,大熊貓在自己的格式,而不是使用date2num
和num2date
轉換datetime
對象)。
看起來像一個可能的解決方案是寫一個custom scaler,但這似乎很複雜。
據我所知,編寫一個自定義Locator
只會改變滴答位置(小垂直線和相關標籤),而不是繪圖本身的位置。那是對的嗎?
UPD:一個簡單的解決方案是改變時間戳(比如說,將它們重新計算爲「自啓動以來的時間」),但我更願意保留它們。
UPD:在https://stackoverflow.com/a/5657491/1214547作品對我來說有一些修改答案。我會盡快寫出我的解決方案。
你想對你的x軸是不連續的或者你想調整數據的時間戳嗎? – karlson
@karlson:前者。後者很簡單,我會用它作爲最後的手段,但我更願意保留原始時間戳。 – Pastafarianist
也許你可以基於這個例子:http://matplotlib.org/examples/pylab_examples/broken_axis.html – karlson