2010-06-08 131 views
2

我正在使用Matplotlib從數據庫動態生成.png圖表。用戶可以將任何給定範圍的日期時間設置爲x軸,並且我需要考慮所有的日期時間。雖然Matplotlib具有dates.AutoDateLocator(),但我希望打印在圖表上的日期時間格式是特定於上下文的 - 例如,如果用戶從下午3點開始製圖。到下午5點,不需要顯示年/月/日信息。現在,我手動創建Locator和Formatter對象:Matplotlib autodatelocator自定義日期格式?

def get_ticks(start, end): 
    from datetime import timedelta as td 
    delta = end - start 

    if delta <= td(minutes=10): 
     loc = mdates.MinuteLocator() 
     fmt = mdates.DateFormatter('%I:%M %p') 
    elif delta <= td(minutes=30): 
     loc = mdates.MinuteLocator(byminute=range(0,60,5)) 
     fmt = mdates.DateFormatter('%I:%M %p') 
    elif delta <= td(hours=1): 
     loc = mdates.MinuteLocator(byminute=range(0,60,15)) 
     fmt = mdates.DateFormatter('%I:%M %p') 
    elif delta <= td(hours=6): 
     loc = mdates.HourLocator() 
     fmt = mdates.DateFormatter('%I:%M %p') 
    elif delta <= td(days=1): 
     loc = mdates.HourLocator(byhour=range(0,24,3)) 
     fmt = mdates.DateFormatter('%I:%M %p') 
    elif delta <= td(days=3): 
     loc = mdates.HourLocator(byhour=range(0,24,6)) 
     fmt = mdates.DateFormatter('%I:%M %p') 
    elif delta <= td(weeks=2): 
     loc = mdates.DayLocator() 
     fmt = mdates.DateFormatter('%b %d') 
    elif delta <= td(weeks=12): 
     loc = mdates.WeekdayLocator() 
     fmt = mdates.DateFormatter('%b %d') 
    elif delta <= td(weeks=52): 
     loc = mdates.MonthLocator() 
     fmt = mdates.DateFormatter('%b') 
    else: 
     loc = mdates.MonthLocator(interval=3) 
     fmt = mdates.DateFormatter('%b %Y') 
    return loc,fmt 

有沒有更好的方法來做到這一點?

回答

1

請問AutoDateFormatter做你想要的嗎?即使不這樣做,您也可能想要查看其源代碼,以獲得更緊湊的實現格式字符串選擇的方式。

在發佈的版本中,您無法自定義每個級別的格式,但在development code中可以。您可能只需將主幹中的版本複製到您自己的代碼中即可。

+0

不幸的是,我的問題與AutoDateFormatter是它不會讓你自定義格式的各個層次。因此,無論您喜歡與否,其分鐘級格式化都將在「HH:MM:SS時區」中進行。 – jbreed 2010-06-11 23:29:19

+0

我編輯了答案,提到開發版本比這個版本更好。 – 2010-06-12 06:01:00