2017-02-22 46 views
5

Próbuję wykreślić wartości temperatury w czasie z czasem sformatowanym jako HH: MM. Jestem w stanie ustawić powtarzające się xticks co 15 minut, ale pierwsze tiknięcie jest po raz pierwszy (np. 04:40).Matplotlib: xticks co 15 minut, począwszy od godziny

Czy istnieje sposób przeniesienia kleszczy na godzinę i współbieżne ćwierć-godziny (04:45, 05:00, 05:15 itd.)? Mój bieżący kod wygląda następująco:

import matplotlib.pyplot as plt 
import matplotlib.dates as md 
import datetime as dt 

## Dummy times and temperatures 
time = [dt.datetime(2017,2,15,4,40),dt.datetime(2017,2,15,4,46),dt.datetime(2017,2,15,4,52),dt.datetime(2017,2,15,4,58),dt.datetime(2017,2,15,5,4),dt.datetime(2017,2,15,5,10)] 
temp = [7, 8, 9, 10, 11, 12] 

## Plot the data 
figtemp, ax = plt.subplots(1, 1) 
ax.plot(time, temp) 

## Set time format and the interval of ticks (every 15 minutes) 
xformatter = md.DateFormatter('%H:%M') 
xlocator = md.MinuteLocator(interval = 15) 

## Set xtick labels to appear every 15 minutes 
ax.xaxis.set_major_locator(xlocator) 

## Format xtick labels as HH:MM 
plt.gcf().axes[0].xaxis.set_major_formatter(xformatter) 

Odpowiedz

-1

Korzystając Axes.set_xticklabels,

labels = ['04:45', '05:00', '05:15'] 
plt.gca().set_xticklabels(labels) 

który produkuje,

enter image description here


czas przejścia do jednoczesnych kwartał godzinach,

import datetime 

list_dt = [ datetime.datetime(2017,2,15,4,40), 
      datetime.datetime(2017,2,15,4,46), 
      datetime.datetime(2017,2,15,4,52), 
      datetime.datetime(2017,2,15,4,58), 
      datetime.datetime(2017,2,15,5,4), 
      datetime.datetime(2017,2,15,5,10)] 

adjust_list_dt = list() 

for dt in list_dt: 
    print(dt.minute//15) 

    if dt.minute % 15 == 0: 
     adjust_minutes = dt.minute 
    else: 
     adjust_minutes = (dt.minute//15 + 1)*15 

    if adjust_minutes == 60: 
     adjust_list_dt.append(dt.replace(hour=dt.hour+1, minute=0)) 
    else: 
     adjust_list_dt.append(dt.replace(minute=adjust_minutes)) 

print(adjust_list_dt) 
# Output 
''' 
[datetime.datetime(2017, 2, 15, 4, 45), 
datetime.datetime(2017, 2, 15, 5, 0), 
datetime.datetime(2017, 2, 15, 5, 0), 
datetime.datetime(2017, 2, 15, 5, 0), 
datetime.datetime(2017, 2, 15, 5, 15), 
datetime.datetime(2017, 2, 15, 5, 15)] 
''' 
+0

Problem polega na tym, że trzeba znać godziny, w których dane pojawiają się wcześniej. Nie trzeba też wpisywać czasu ręcznie. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest, pls sprawdził moją zredagowaną odpowiedź. Uważam, że twoje rozwiązanie jest bardziej eleganckie. – SparkAndShine

+1

Tak, to rozwiązuje problem ręcznego ustawiania godzin i minut. Miły. Ale rzeczywiście jest to trochę skomplikowane dla zadania, które można wykonać w jednym wierszu. – ImportanceOfBeingErnest

6

Można powiedzieć, że MinuteLocator używają tylko minut 0,15,30,45 przy użyciu argumentu byminute.

xlocator = md.MinuteLocator(byminute=[0,15,30,45], interval = 1)