2010-06-08 7 views
2

J'utilise Matplotlib pour générer dynamiquement des diagrammes .png à partir d'une base de données. L'utilisateur peut définir en tant qu'axe x une plage donnée de datetime, et je dois prendre en compte tout cela. Alors que Matplotlib a les dates. AutoDateLocator(), je veux que le format datetime imprimé sur le graphique soit spécifique au contexte - par ex. si l'utilisateur est en train de tracer à partir de 15 heures à 17 heures, les informations de l'année/mois/jour n'ont pas besoin d'être affichées. En ce moment, je crée manuellement les objets Locator et Formatter:Matplotlib autodatelocator format de date personnalisé?

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 

Y a-t-il une meilleure façon de procéder?

Répondre

1

Est-ce que AutoDateFormatter fait ce que vous voulez? Même si ce n'est pas le cas, vous pouvez jeter un oeil à son code source pour une manière un peu plus compacte d'implémenter le choix de la chaîne de format.

Dans la version finale, vous ne pouvez pas personnaliser les formats par niveau, mais dans le development code vous pouvez. Vous pourriez probablement simplement copier la version du tronc dans votre propre code.

+0

Malheureusement, mon problème avec l'AutoDateFormatter est qu'il ne vous laissera pas personnaliser les différents niveaux. Donc, son formatage au niveau des minutes va être dans "HH: MM: SS Timezone", que cela vous plaise ou non. – jbreed

+0

J'ai édité la réponse pour mentionner que la version de développement est meilleure à cet égard que celle publiée. –