繪製python資料時間的累積圖
說我有一個datetimes的列表,我們知道每個datetime是事件發生的記錄時間.
在matplotlib中可以繪製此事件隨時間發生的頻率,在累積圖中顯示此資料(以便每個點都大於或等於之前的所有點),而無需預處理此列表? (例如,將datetime物件直接傳遞給某些精彩的matplotlib函式)
或者我需要將這個資料表列錶轉換成字典項列表,例如:
{“year”:1998,“month”:12,“date”:15,“events”:92}
然後從此列表生成圖表?
對不起,如果這似乎是一個愚蠢的問題,我並不是很熟悉matplotlib,而且如果matplotlib已經可以處理datetime物件本身,並希望以後者的方式來節省自己的努力.
這應該適合你:
counts = arange(0, len(list_of_dates)) plot(list_of_dates, counts)
當然,你可以給圖表呼叫一些常用的選項,讓圖形看起來像你想要的. (我會指出,matplotlib非常擅長處理日期和時間.)
另一個選項是ofollow,noindex" target="_blank">hist function – 它有一個選項’cumulative = True’可能是有用的.您可以建立累積直方圖,顯示在任何給定日期之前發生的事件數量,如下所示:
from pyplot import hist from matplotlib.dates import date2num hist(date2num(list_of_dates), cumulative=True)
但是這會產生一個條形圖,這可能不是你想要的,而在任何情況下,使水平軸上的日期標籤正確顯示可能需要一些Fudging.
編輯:我有一個感覺,你真正想要的是每個日期的一點(或酒吧),相應的y值是發生到(包括?)該日期的事件的數量.在這種情況下,我建議這樣做:
grouped_dates = [[d, len(list(g))] for d,g in itertools.groupby(list_of_dates, lambda k: k.date())] dates, counts = grouped_dates.transpose() counts = counts.cumsum() step(dates, counts)
來自itertools模組的groupby函式將產生您要查詢的資料型別:只有每個日期的單個例項,並附帶有具有該日期的所有datetime物件的列表(實際上是迭代器).正如Jouni在評論中所建議的那樣,步驟功能將給出一個在每個事件發生的日子進行升級的圖形,所以我建議使用它代替情節.
(帽子提示給EOL提醒我關於cumsum)
如果您想每天都有一個點,無論是否在當天發生任何事件,您需要修改以上程式碼:
from matplotlib.dates import drange, num2date date_dict = dict((d, len(list(g))) for d,g in itertools.groupby(list_of_dates, lambda k: k.date())) dates = num2date(drange(min(list_of_dates).date(), max(list_of_dates).date() + timedelta(1), timedelta(1))) counts = asarray([date_dict.get(d.date(), 0) for d in dates]).cumsum() step(dates, counts)
我不認為這對於通過step函式生成的情節來說真的會有所作為.
程式碼日誌版權宣告:
翻譯自:http://stackoverflow.com/questions/3034162/plotting-a-cumulative-graph-of-Python-datetimes