2016-02-26 3 views
1

Мне хотелось бы построить время из серии datetime64, где ось Y отформатирована как «% H:% M, показывая только 00:00, 01:00, 02:00 и т. Д.Как построить время по оси Y в формате «% H:% M» в matplotlib?

это это то, что выглядит сюжет без настройки форматирования оси y.

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
from matplotlib.dates import DateFormatter 
from matplotlib.dates import HourLocator 

df = pd.DataFrame(data=dict(a=pd.date_range('1/1/2011',periods=1440000,freq='1min'))) 
df = df.iloc[np.arange(0,1440*100,1440)+np.random.randint(1,300,100)] 

plt.plot(df.index,df['a'].dt.time) 
plt.show() 

enter image description here

После прочтения вокруг на тему на SO, я попытался следующий, но без успеха.

ax = plt.subplot() 
ax.yaxis.set_major_locator(HourLocator()) 
ax.yaxis.set_major_formatter(DateFormatter('%H:%M')) 
plt.plot(df.index,df['a'].dt.time) 
plt.show() 

ValueError: DateFormatter found a value of x=0, which is an illegal date. This usually occurs because you have not informed the axis that it is plotting dates, e.g., with ax.xaxis_date() 

Может ли кто-нибудь мне посоветовать?

ответ

1

Для того, чтобы работать, вы должны пройти datetime объекты (и я имею в виду, а не datetimedatetime64). Вы можете конвертировать все временные метки в ту же дату, а затем использовать .tolist(), чтобы получить фактические datetime объектов.

y = df['a'].apply(lambda x: x.replace(year=1967, month=6, day=25)).tolist() 
ax = plt.subplot() 
ax.plot(df.index, y) 
ax.yaxis.set_major_locator(HourLocator()) 
ax.yaxis.set_major_formatter(DateFormatter('%H:%M')) 

enter image description here

+0

Импорт панд неявно устанавливает конвертеры для правильной работы с datetime64 (путем отмывания их через пакетный тип данных pandas dt64). – tacaswell

+0

спасибо @tcaswell, но pandas (0.17.0) был импортирован в моем примере выше. любые предложения о том, почему он не работает? – themachinist

+0

@tcaswell Не уверен, что вы имеете в виду, мне пришлось добавить вызов '.tolist()', чтобы сделать работу HourLocator. Я заметил, что при построении «.df.time» matplotlib использовали материал панд для тиков и меток, но я не нашел простой способ настроить их для удовлетворения требований. – Goyo

0

Вы можете попробовать две вещи: 1) он должен быть ax.xaxis .... не ax.yaxis .... 2) Используйте set_major_locator() вместо set_major_formatter() для локатора. Пример показан ниже.

min = 15 
ax.xaxis.set_major_locator(MinuteLocator(byminute=range(0,60,min))) 
ax.xaxis.set_major_formatter(DateFormatter('%H:%M')) 
+1

спасибо, но эти линии Dont появляются работать. также, почему это должно быть ax.axis, когда время находится на оси y? – themachinist

Смежные вопросы