2010-11-03 48 views
31

Tôi muốn tạo một giá trị thời gian chung với mô-đun matplotlib của python. Thời gian của tôi ở trong thời gian unix nhưng tôi muốn chúng hiển thị ở định dạng có thể đọc được trên trục x của ô.vẽ biểu đồ các dấu thời gian unix trong matplotlib

Tôi đã đọc câu trả lời về âm mưu với các đối tượng ngày giờ nhưng phương pháp này dường như xóa thông tin giờ/phút/giây và dấu thời gian đường ray cho cả ngày. Có cách nào để tạo các ô này và hiển thị các nhãn chi tiết hơn không?

+0

Matplotlib chắc chắn _doesn't_ loại bỏ các thông tin thời gian khi âm mưu datetimes ... Bạn đang làm gì chính xác? Bạn chỉ muốn thay đổi ghi nhãn của trục? Bạn chỉ muốn một đánh dấu/nhãn cho mỗi điểm dữ liệu được vẽ? –

Trả lời

48

Có thể gọi plt.plot(dates,values) với dates là danh sách các đối tượng datetime.datetime. Cốt truyện sẽ bao gồm xticks ở định dạng như '%Y-%m-%d' và khi bạn phóng to, tự động thay đổi thành ô hiển thị giờ, phút, giây.

Tuy nhiên, có vẻ như bạn muốn kiểm soát nhiều hơn điều này. Có lẽ nó không hiển thị giờ, phút, giây theo tỷ lệ bạn muốn.

Trong trường hợp đó, bạn có thể thiết lập định dạng ngày của riêng mình:

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

Thật không may, nếu bạn vượt qua datetime.datetime đối tượng để plt.plot, các xticks tự động lựa chọn bởi matplotlib dường như luôn luôn có giây bằng số không. Ví dụ, nếu bạn chạy

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

ngày sau đó bạn được định dạng đẹp, nhưng tất cả những giây xtick là zero.

Vậy giải pháp là gì?

Nếu bạn chuyển đổi dấu thời gian của mình -> datetime.datetime objects -> datplums matplotlib mình và chuyển datenums thành plt.plot, thì các giây được giữ nguyên.

PS. Bởi "matplotlib datenum" Tôi có nghĩa là loại số được trả về bởi 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

Ví dụ hay! Đối với những gì nó có giá trị nó không phải là những giây đang bị mất bởi việc chuyển đổi bởi 'date2num'. Đó là định vị đánh dấu tự động chọn vị trí thứ hai cho các nhãn đánh dấu. –

+0

@Joe: Vâng, bạn hoàn toàn đúng. Tôi bắt đầu nhận ra rằng khi tôi mò mẫm xung quanh chỉnh sửa điều này .... :) – unutbu

+0

Câu trả lời tuyệt vời, cảm ơn! – Matt

Các vấn đề liên quan