2010-11-03 20 views
31

Python'un matplotlib modülü ile genel bir değer -vs-time çizimi yapmak istiyorum. Zamanlarım unix zamanlarında ama çizimin x ekseni üzerinde okunabilir bir biçimde gösterilmesini istiyorum.matplotlib'de unix zaman damgalarını çizme

datetime nesneleriyle çizim hakkında cevapları okudum, ancak bu yöntemin saat/dakika/sn bilgi ve rayları zaman damgalarını tüm güne çıkardığı görülüyor. Bu grafikleri oluşturmanın ve daha ayrıntılı etiketler göstermenin bir yolu var mı?

+0

Matplotlib kesinlikle yaptığınızı tam olarak ne ... zaman bilgilerini kaldırmak _doesn't_? Eksenin etiketini değiştirmek mi istiyorsun? Çizilen veri noktası başına sadece bir onay/etiket mi istiyorsunuz? –

cevap

48

datesplt.plot(dates,values) ile datetime.datetime nesnelerinin bulunduğu bir listeyi aramak mümkündür. Arsa, xtick'leri '%Y-%m-%d' gibi bir biçimde içerecek ve siz yakınlaştırdıkça, otomatik olarak saat, dakika, saniye gösteren birime dönüşecektir. Bununla birlikte, bundan daha fazla kontrol sahibi olmak istediğiniz gibi geliyor. Belki de istediğiniz skalada saat, dakika, saniye gösterilmez. Eğer plt.plot için datetime.datetime nesneleri geçerse

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

yazık ki, otomatik matplotlib tarafından seçilen xticks daima sıfıra eşit saniye var gibi görünüyor:

Bu durumda, kendi tarih biçimlendirici ayarlayabilirsiniz. Örneğin,

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

o zaman güzel biçimlendirilmiş olsun tarihleri ​​çalıştırmak, ancak tüm XTick saniye sıfır olursa.

Peki, çözüm nedir?

Zaman damgalarınızı -> datetime.datetime nesneleri -> matplotlib verilerinizi dönüştürürseniz ve verileri plt.plot olarak geçirirseniz, saniye korunur.

PS. "Matplotlib datenum" ile, matplotlib.dates.date2num tarafından döndürülen numara türünü kastediyorum. tarihsaat çizdirirken

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

Güzel örnek! Değeri ne olursa olsun, 'date2num' tarafından dönüşümle saniyeler kaybedilmiyor. Kene işaretleyicisinin, kene etiketleri için otomatik olarak ikinci konumları bile seçmesidir. –

+0

@Joe: Evet, kesinlikle haklısınız. Bu şeyi düzenleme etrafında arandığım gibi fark ettim .... :) – unutbu

+0

Harika cevap, teşekkürler! – Matt

İlgili konular