построение временных меток Unix в matplotlib - PullRequest
40 голосов
/ 03 ноября 2010

Я хотел бы создать график общего значения -vs- с помощью модуля python matplotlib.Мои времена в Unix, но я бы хотел, чтобы они отображались в удобочитаемом формате на оси X графика.

Я прочитал ответы о построении графиков с объектами даты и времени, но этот метод, похоже, удаляет информацию о часах / мин / с и метках времени до полного дня.Есть ли способ сгенерировать эти графики и показать более гранулярные метки?

1 Ответ

66 голосов
/ 03 ноября 2010

Можно вызвать plt.plot(dates,values) с dates, являющимся списком datetime.datetime объектов. Сюжет будет включать в себя xticks в формате, подобном '%Y-%m-%d', и при увеличении автоматически меняется на тот, который показывает часы, минуты, секунды.

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

В этом случае вы можете настроить собственный форматер даты:

ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)

К сожалению, если вы передаете datetime.datetime объекты в plt.plot, у xticks, автоматически выбираемых matplotlib, кажется, всегда есть секунды, равные нулю. Например, если вы запустите

import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time

n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(dates,values)
plt.show()

alt text

тогда вы получите красиво отформатированные даты, но все xtick секунды равны нулю.

Так в чем же решение?

Если вы конвертируете свои временные метки -> объекты datetime.datetime -> matplotlib datenums самостоятельно и передадите даты в plt.plot, то секунды будут сохранены.

PS. Под «matplotlib datenum» я подразумеваю вид числа, возвращаемого matplotlib.dates.date2num.

import matplotlib.pyplot as plt
import matplotlib.dates as md
import numpy as np
import datetime as dt
import time

n=20
duration=1000
now=time.mktime(time.localtime())
timestamps=np.linspace(now,now+duration,n)
dates=[dt.datetime.fromtimestamp(ts) for ts in timestamps]
datenums=md.date2num(dates)
values=np.sin((timestamps-now)/duration*2*np.pi)
plt.subplots_adjust(bottom=0.2)
plt.xticks( rotation=25 )
ax=plt.gca()
xfmt = md.DateFormatter('%Y-%m-%d %H:%M:%S')
ax.xaxis.set_major_formatter(xfmt)
plt.plot(datenums,values)
plt.show()

alt text

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...