Создание графика с датой и временем в метках оси с помощью matplotlib - PullRequest
29 голосов
/ 31 марта 2011

У меня есть данные в массиве следующей структуры,

[[1293606162197, 0, 0],
 [1293605477994, 63, 0],
 [1293605478057, 0, 0],
 [1293605478072, 2735, 1249],
 [1293606162213, 0, 0],
 [1293606162229, 0, 0]]

Первый столбец - это время эпохи (в ms), второй - y1, третий - y2. Мне нужен график со временем по оси X и y1 и y2 по левой и правой оси Y.

Я просматривал документацию, но не мог найти способ заставить мои тики оси X отображать и дату, и время, например «28/12 16:48», то есть «дата / месяц час: мин. ». Вся документация, которая мне помогает, заключается в отображении одних дат, но это не то, что я хочу. Любая помощь будет оценена по этому вопросу.

И, если может показаться, что это не домашняя работа. Это фактически продолжение моего предыдущего вопроса Чтение и построение графиков данных, прочитанных из огромных файлов .

1 Ответ

43 голосов
/ 31 марта 2011

Надеюсь, это поможет. Мне всегда было тяжело с датами matplotlib. Matplotlib требует формат float , то есть дни с начала эпохи. Вспомогательные функции num2date и date2num вместе со встроенной в Python datetime могут использоваться для преобразования в / из. Форматирование было взято из этого примера. Вы можете изменить ось на любом графике на ось даты, используя set_major_formatter.

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import dates
import datetime

a = np.array([
    [1293605162197, 0, 0],
    [1293605477994, 63, 0],
    [1293605478057, 0, 0],
    [1293605478072, 2735, 1249],
    [1293606162213, 0, 0],
    [1293606162229, 0, 0]])

d = a[:,0]
y1 = a[:,1]
y2 = a[:,2]

# convert epoch to matplotlib float format
s = d/1000
ms = d-1000*s  # not needed?
dts = map(datetime.datetime.fromtimestamp, s)
fds = dates.date2num(dts) # converted

# matplotlib date format object
hfmt = dates.DateFormatter('%m/%d %H:%M')

fig = plt.figure()
ax = fig.add_subplot(111)
ax.vlines(fds, y2, y1)

ax.xaxis.set_major_locator(dates.MinuteLocator())
ax.xaxis.set_major_formatter(hfmt)
ax.set_ylim(bottom = 0)
plt.xticks(rotation='vertical')
plt.subplots_adjust(bottom=.3)
plt.show()

result

...