Matplotlib: xticks каждые 15 минут, начиная с часа

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

Есть ли способ сместить тики, чтобы они происходили в час и в одновременные четверть часа (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)

person user7606255    schedule 22.02.2017    source источник
comment
ответ @ImportanceOfBeingErnest решает проблему ИМХО, почему вы не отмечаете его как принятое?   -  person Alexei Martianov    schedule 22.10.2019


Ответы (2)


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

xlocator = md.MinuteLocator(byminute=[0,15,30,45], interval = 1)
person ImportanceOfBeingErnest    schedule 22.02.2017
comment
как это должно мне помочь? Где я должен использовать переменную xlocator? а что такое md? - person Intelligent-Infrastructure; 08.10.2019
comment
@Intelligent-Infrastructure Вам нужно прочитать Вопрос и ответ! - person ImportanceOfBeingErnest; 08.10.2019

Используйте Axes.set_xticklabels,

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

который производит,

введите здесь описание изображения


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

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)]
'''
person SparkAndShine    schedule 22.02.2017
comment
Проблема здесь в том, что вам нужно заранее знать часы, когда появляются данные. Кроме того, довольно неудобно вводить время вручную. - person ImportanceOfBeingErnest; 22.02.2017
comment
@ImportanceOfBeingErnest, пожалуйста, проверьте мой отредактированный ответ. Я считаю, что ваше решение более элегантно. - person SparkAndShine; 22.02.2017
comment
Да, это решает проблему ручной установки часов и минут. Хороший. Но это действительно немного сложно для задачи, которую можно выполнить в одну строку. - person ImportanceOfBeingErnest; 22.02.2017
comment
@ImportanceOfBeingErnest Я согласен. Только что проголосовал за ваш ответ. - person SparkAndShine; 22.02.2017