2017-02-22 100 views
5

Я пытаюсь построить значения температуры по времени со временем, отформатированным как HH: MM. Я могу установить, чтобы xticks повторялись каждые 15 минут, но первый тик в первый раз (например, 04:40).Matplotlib: xticks каждые 15 минут, начиная с часа

Есть ли способ сдвинуть тики на час и на ближайшие четверть часа (04:45, 05:00, 05:15 и т. Д.)? Мой текущий код выглядит следующим образом:

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) 

ответ

-1

Использование Axes.set_xticklabels,

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

, которая производит,

enter image description here


сдвиг по времени в параллельных четверть часа,

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

Проблема заключается в том, что вам нужно знать часы, в которые данные происходят раньше. Также довольно неудобно вводить время вручную. – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest, PLS проверил мой отредактированный ответ. Я считаю, что ваше решение более элегантно. – SparkAndShine

+1

Да, это решает проблему ручной установки часов и минут. Ницца. Но это действительно немного сложно для задачи, которая может быть выполнена в одной строке. – ImportanceOfBeingErnest

6

Вы можете сообщить MinuteLocator только с использованием минут 0,15,30,45 с использованием аргумента byminute.

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