2010-11-03 25 views
31

Ich würde gerne eine generische Wert-Vs-Zeit-Diagramm mit Python Matplotlib-Modul. Meine Zeiten sind in Unix-Zeit, aber ich möchte, dass sie in einem lesbaren Format auf der X-Achse des Grundstücks erscheinen.Plotten Unix Zeitstempel in Matplotlib

Ich habe Antworten zum Plotten mit Datetime-Objekten gelesen, aber diese Methode scheint Stunden/Min/Sek. Informationen zu entfernen und Zeitstempel auf den ganzen Tag zu übertragen. Gibt es eine Möglichkeit, diese Plots zu generieren und detailliertere Labels anzuzeigen?

+0

Matplotlib sicherlich die Zeitinformation _doesn't_ zu entfernen, wenn Datetimes Plotten ... Was genau machst du da? Möchten Sie nur die Beschriftung der Achse ändern? Wünschen Sie nur einen Tick/Label pro geplottetem Datenpunkt? –

Antwort

48

Es ist möglich, plt.plot(dates,values) aufzurufen, wobei dates eine Liste von datetime.datetime Objekten ist. Das Diagramm enthält Xticks in einem Format wie '%Y-%m-%d'. Wenn Sie hineinzoomen, wird automatisch ein Diagramm angezeigt, das Stunden, Minuten und Sekunden anzeigt.

Es klingt jedoch, als ob Sie mehr Kontrolle wünschen als dies. Vielleicht zeigt es nicht die Stunden, Minuten, Sekunden auf der Skala, die Sie wünschen.

In diesem Fall können Sie Ihr eigenes Datum Formatter einrichten:

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

Leider, wenn Sie datetime.datetime Objekte plt.plot, die xticks automatisch ausgewählt von matplotlib passieren scheint immer Sekunden gleich Null zu haben. Wenn Sie zum Beispiel, führen

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

dann erhalten Sie schön formatierte Daten, aber alle Xtick Sekunden sind Null.

Also, was ist die Lösung?

Wenn Sie Ihre Zeitstempel -> datetime.datetime Objekte -> matplotlib dateinamen selbst konvertieren und die Datennummern an plt.plot übergeben, werden die Sekunden beibehalten.

PS. Mit "matplotlib datenum" meine ich die Art von Nummer, die von matplotlib.dates.date2num zurückgegeben wird.

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

Schönes Beispiel! Denn es lohnt sich nicht, dass die Sekunden durch die Konvertierung von 'date2num' verloren gehen. Es ist, dass der Tick-Locator automatisch sogar zweite Positionen für die Tick-Labels auswählt. –

+0

@Joe: Ja, du hast absolut recht. Ich fing an zu realisieren, dass, während ich fummelte um dieses Ding zu bearbeiten .... :) – unutbu

+0

Große Antwort, danke! – Matt