2010-01-10 21 views
7

Ich habe Daten wie folgt aus:Grafische Darstellung von Daten auf Zeit (Datum) Achse in Matlab

22.10.1980. 100 
25.10.1980. 120 
26.10.1980. 12 

(nur viel mehr davon, und für jedes Datum, mehrere unabhängige Messungen auf der rechten Seite).

Nun, das ist wahrscheinlich trivial, aber ich habe noch nie so etwas in Matlab getan, und habe Probleme, ähnliche Beispiele online zu finden. Ich muss die Daten auf einer Zeit-/Datumsachse (x-Achse) darstellen, mit allen Daten innerhalb (also, 23. und 24. ebenso ... für die ich keine Messungen habe).

Ich frage nicht nach jemandem, der das für mich löst, aber wenn du andeuten könntest, welcher Weg der beste sein sollte. Ich habe noch nie einen solchen Datentyp verwendet, daher habe ich Probleme, einen Weg zu finden, Daten für den Anfang zu laden.

Antwort

16

Es scheint, als ob es am besten wäre, datetick zu verwenden.

+3

+1: Schöne finden. Ich wusste nichts von dieser Funktion. – gnovice

+1

Das ist veraltet. Jetzt sollten Sie datetime http://www.mathworks.com/help/matlab/matlab_prog/plot-dates-and-durations.html verwenden – hyprfrcb

1

Sie können datenum verwenden, um die Daten in Zahlen zu konvertieren und die Daten wie gewohnt zu zeichnen. Nehmen wir an, Sie setzen Ihren Datenvektor in die Variable x. Jetzt können Sie

set(gca, 'xtick',x(1:10:end)); 
set(gca, 'xticklabel',datestr(x(1:10:end)); 

verwenden, um die Zecken auf der x-Achse einzustellen.

4

Ihre Datendatei Unter der Annahme hat das Format oben angegebenen Sie TEXTSCAN nutzen, um die Daten zu lesen:

fid = fopen('data.txt','rt'); 
C = textscan(fid,'%s %s %s %d','Delimiter','.','CollectOutput',1); 
fclose(fid); 

Die erste Zelle von C wird ein N-by-3-Zellen-Array von Strings (die Teile enthalten des Datums) und die zweite Zelle von C wird einen N-mal-1-Vektor der Datenmessungen enthalten. Sie können zuerst Verketten der drei kleineren Zeichenfolgen in eine Datumszeichenfolge ein Datum Nummer für jede Messung erstellen und dann die DATENUM Funktion:

t = datenum(strcat(C{1}(:,3),'-',C{1}(:,2),'-',C{1}(:,1))); 
data = C{2}; 

Sobald Sie einen Vektor von Datumszahlen t mit Vektor der Messungen gehen data, können Sie sie zeichnen:

plot(t,data,'*'); %# Plot the points as asterisks 

Jetzt können Sie die x-Achsenbeschriftungen ändern, um die tatsächlichen Daten zu zeigen. Eine Option ist die Verwendung der Funktion DATETICK, eine einfache und elegante Lösung, die in steven's answer gegeben ist. Eine weitere Option ist die Funktion DATESTR zu verwenden, um die Etiketten selbst zu erstellen, ändern Sie dann die XTick und XTickLabel Eigenschaften der aktuellen Achsen:

xpts = min(t):max(t); %# Make a full vector, filling in missing dates 
set(gca,'XTick',xpts,'XTickLabel',datestr(xpts)); %# Set axes properties 

HINWEIS: Unabhängig davon, welche Option Sie zum Ändern der x-Achse wählen Etiketten zu Datumsstrings, kann es zu Problemen kommen, wenn die Etiketten einander überlappen, wenn die Teilstriche zu nahe beieinander liegen. Sie können dies beheben, indem Sie die Teilstriche entlang der x-Achse verkleinern oder neu positionieren (indem Sie die Eigenschaft XTick ändern) oder die Eigenschaft FontSize der Achse anpassen. Wenn Sie die Beschriftungen drehen möchten, um sie passend zu machen, müssen Sie die Beschriftungen löschen und neue gedrehte text objects für sie erstellen.Die folgende Vorlage auf The MathWorks File Exchange macht genau das:

2

Datetick ist eine gute Option, sowie datetick2, die hier gefunden werden kann: MATLAB Central

Datetick2 ermöglicht Schwenken und Zoomen, mit Anpassungen der Zeitbeschriftungen, abhängig davon, wie weit Sie herangezoomt sind.

Ich bin mir nicht sicher über das Format dd.mm.yyyy - Sie könnten regexp oder strrep verwenden, um die Dezimalstellen bei Bedarf in Bindestriche zu ändern.

3

Mit dateiname können Sie ein beliebiges String-Datum basierend auf den Datumsformatsymbolen in ein numerisches Format umwandeln (siehe Hilfedatenstr).

Zum Beispiel all dies führt zu dem gleichen numerischen Datumsdarstellung:

datenum('15/05/2009 21:22','dd/mm/yyyy HH:MM');
datenum('15.05.2009 21:22','dd.mm.yyyy HH:MM');
datenum('21-22 15.05.2009','HH-MM dd.mm.yyyy');
datenum('21-22 05/15.2009','HH-MM mm/dd.yyyy');
...

Das Schöne daran ist, dass Sie Zellenfeld (Ausgabe von textscan) passieren kann oder char-Array direkt an datenum- und es wird ausgegeben numerisches Datumsfeld

Verwandte Themen