2013-03-06 19 views
13

Mam prosty zestaw danych wartości X i Y, które wykreślam w matplotlib. Zmienna niezależna w moich danych to czas trwania/timedelta (np. 60 sekund, 2 godziny, 24 godziny, 10 dni), które w moich danych wejściowych są zawsze reprezentowane jako liczba całkowita sekund. Moje pytanie brzmi, czy matplotlib ma jakiś sposób inteligentnego ustawiania etykiet osi czasu w ludzkiej czytelnej formie?inteligentne etykiety osi matplotlib dla timedelta

Na przykład na małym końcu skali pożądane byłoby, aby pokazać 30 sekund po prostu jako "30 sekund". Na dużym końcu skali lepiej byłoby pokazać "10 dni" zamiast 864000 sekund. Gdzieś pomiędzy, lepiej byłoby, gdyby etykiety były czytane w "minutach" i "godzinach". Czy matplotlib ma jakiś zautomatyzowany sposób wnioskowania czegoś w przybliżeniu ludzkiego czytelnego dla czasów trwania rzędu kilku rzędów wielkości?

Bez względu na to, jakie podejście zastosuję, należy uogólnić na zbiory danych obejmujące różne ramy czasowe, a nie wykresy dostosowane indywidualnie do jednego zestawu danych wejściowych.

Odpowiedz

12

Czy możesz podać przykład? Czy to, co chcesz:

import datetime                                                                 

import numpy as np                                                                
import pylab as plt                                                                
import matplotlib                                                                

fig = plt.figure()                                                                
ax = fig.add_subplot(111)                                                              

x = np.linspace(0, 300) # 5 minutes                                                              
y = np.random.random(len(x))                                                             

ax.plot(x, y)                                                                 

def timeTicks(x, pos):                                                               
    d = datetime.timedelta(seconds=x)                                                           
    return str(d)                                                                
formatter = matplotlib.ticker.FuncFormatter(timeTicks)                                                       
ax.xaxis.set_major_formatter(formatter)                                                           

plt.show() 

Example output

Wykorzystuje pytony timedelta. Przy 864000 sekundach powyższe spowoduje "10 dni, 10:00:00". Oczywiście możesz dodać bardziej zaawansowane formatowanie do powyższej funkcji timeTicks().

+0

Dodatkowo, jeśli chcesz zmodyfikować xticks, aby pokazać się co minutę: 'ax.xaxis.set_major_locator (plt.MultipleLocator (1 * 60)) –

Powiązane problemy