2010-11-03 13 views
31

में यूनिक्स टाइमस्टैम्प प्लॉटिंग मैं पाइथन के matplotlib मॉड्यूल के साथ एक सामान्य मूल्य -vs-time प्लॉट बनाना चाहता हूं। मेरे समय यूनिक्स समय में हैं लेकिन मैं उन्हें साजिश के एक्स-अक्ष पर एक पठनीय प्रारूप में दिखाना चाहता हूं।matplotlib

मैंने डेटाटाइम ऑब्जेक्ट्स के साथ साजिश के बारे में उत्तर पढ़े हैं लेकिन यह विधि पूरे दिन घंटे/मिनट/सेकंड की जानकारी और रेल टाइमस्टैम्प को हटाने के लिए प्रतीत होती है। क्या इन भूखंडों को उत्पन्न करने और अधिक दानेदार लेबल दिखाने का कोई तरीका है?

+0

matplotlib निश्चित रूप से समय की जानकारी को दूर _doesn't_ जब datetimes की साजिश रचने ... कि वास्तव में आप क्या कर रहे हो? क्या आप सिर्फ धुरी के लेबलिंग को बदलना चाहते हैं? क्या आप प्रति प्लॉट डेटा पॉइंट पर सिर्फ एक टिक/लेबल चाहते हैं? –

उत्तर

48

यह datesdatetime.datetime वस्तुओं की एक सूची होने के साथ plt.plot(dates,values) कॉल करने के लिए संभव है। साजिश में '%Y-%m-%d' जैसे प्रारूप में xticks शामिल होंगे और जैसे ही आप ज़ूम इन करेंगे, स्वचालित रूप से उसमें बदल जाएंगे जो घंटे, मिनट, सेकंड दिखाता है।

हालांकि, ऐसा लगता है कि आप इससे अधिक नियंत्रण चाहते हैं। शायद यह आपके इच्छित पैमाने पर घंटे, मिनट, सेकंड नहीं दिखा रहा है।

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

दुर्भाग्यवश, अगर आप plt.plot को datetime.datetime वस्तुओं गुजरती हैं, 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 पर पास करते हैं, तो सेकंड संरक्षित होते हैं।

पीएस। "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' द्वारा रूपांतरण द्वारा सेकंड खो जा रहे हैं। यह है कि टिक लोकेटर स्वचालित रूप से टिक लेबल के लिए दूसरे स्थान भी चुन रहा है। –

+0

@ जो: हाँ, आप बिल्कुल सही हैं। मुझे एहसास हुआ कि जैसे ही मैंने इस बात को संपादित करने के लिए फंसे हुए .... :) – unutbu

+0

महान उत्तर, धन्यवाद! – Matt