2012-09-19 77 views
1

我使用Matplotlib繪製賽車事件的速度/距離數據,例如距離與時間的關係,時間是水平軸,距離是垂直軸。timedeltas的繪圖軸格式爲DD HH:MM:SS與matplotlib

我的輸入是兩個矢量,一個包含「從事件開始秒數」中的時間值,另一個包含「到目前爲止所走過的距離」。在同一地塊可以有很多運動員,所以我可以比較它們。

是,如果我繪製純時間,我得到X軸以秒爲單位,這是不自然的讀出的問題:

enter image description here

我可以根據實際日期和時間繪製數據一天,我也得到易讀的結果,但畢竟是在絕對時間,不是因爲事件開始經過的時間(這個開始於大約上午6:00):

enter image description here

我想這將是一個辦法得到el以HMS格式(與第二個圖形相同,但相對於事件開始的時間相同)以及可能具有縮放級別的「感知」(切換到小時:分鐘,然後到天:當縮放級別改變時的小時)將標籤堵塞得太近以及與縮放無關的數據)。

感謝您的幫助!

回答

2

我懷疑最簡單的方法是編寫自己的Formatterdoc),將其轉換爲HMS。

import matplotlib 

class myFormatter(matplotlib.ticker.Formatter): 
    def __call__(self,in_value_in_seconds,pos=None): 
     hours = int(in_value_in_seconds//(3600)) 
     in_value_in_seconds -= hours * 3600 
     mins = int(in_value_in_seconds//(60)) 
     in_value_in_seconds -= mins * 60 
     secs = int(in_value_in_seconds) 

     return str(hours) + ":" + str(mins) + ":" + str(secs) 

這是(我認爲)最簡單的情況,不支持任何縮放。將這些邏輯推入datetime.deltatime對象(或將它們作爲參數)可能會更好。

MultipleLocatordoc)結合使用,您可以非常精確地控制刻度的位置。

+0

我最終這樣做,會添加我自己的答案,以備將來參考。謝謝! – heltonbiker

+0

@heltonbiker看我的編輯 – tacaswell

1

我想通了下面,這就是我正在使用的。仍然不完美(不使用60的倍數作爲主要滴答),但格式本身就是我想要的:

def HMS(seconds, pos): 
    seconds = int(seconds) 
    hours = seconds/3600 
    seconds -= 3600 * hours 
    minutes = seconds/60 
    seconds -= 60 * minutes 
    if hours == 0: 
     if minutes == 0: 
      return "%ds" % (seconds) 
     return "%dm%02ds" % (minutes, seconds) 
    return "%dh%02dm" % (hours, minutes) 

ax = plt.gca() 
ax.xaxis.set_major_formatter(plt.FuncFormatter(HMS)) 
相關問題