2010-06-08 104 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