2010-11-03 111 views
31

我想用python的matplotlib模塊製作一個通用的值 - 時間圖。我的時間在unix時間,但我希望他們以可讀的格式顯示在繪圖的x軸上。在matplotlib中繪製unix時間戳

我已閱讀關於使用日期時間對象進行繪圖的答案,但此方法似乎將小時/分鐘/秒信息和軌道時間戳刪除爲全天。有沒有辦法產生這些情節,並顯示更多的粒度標籤?

+0

Matplotlib肯定_doesn't_繪製日期時間刪除時的時間信息......究竟你在做什麼?你只是想改變軸的標籤?你只是想每個繪製的數據點一個勾號/標籤? – 2010-11-03 20:01:36

回答

48

有可能將plt.plot(dates,values)dates作爲datetime.datetime對象的列表。情節將包括像'%Y-%m-%d'這樣的格式的xticks,並且在您放大時會自動更改爲顯示小時,分鐘和秒鐘的格式。

但是,這聽起來像你想要更多的控制比這個。也許它不會顯示您希望的規模的小時,分​​鍾,秒。

在這種情況下,你可以建立自己的日期格式:

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

不幸的是,如果你通過datetime.datetime對象plt.plot,由matplotlib自動選擇xticks似乎總是等於零秒。例如,如果運行

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秒鐘均爲零。

那麼有什麼解決方案?

如果您自己轉換timestamps - > datetime.datetime對象 - > matplotlib datenums,並將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

+1

不錯的例子!對於它的價值而言,並不是秒數通過'date2num'轉換而丟失。這就是蜱定位器甚至會自動選擇滴答標籤的第二個位置。 – 2010-11-03 20:23:47

+0

@Joe:是的,你是對的。我開始意識到,當我摸索編輯這個東西.... :) – unutbu 2010-11-03 20:26:28

+0

很好的答案,謝謝! – Matt 2010-11-05 15:55:41