plotting data from two years with day of year replacing julian date

2 Ansichten (letzte 30 Tage)
I have the following code for producing a plot of data that extends two years in terms of day of year:
time = datenum('2008-04-17 02:00'):datenum('2009-11-24 12:27');
dateV = datevec(time);
for i = 1:length(time);
DOY(i) = time(i) - datenum(dateV(i,1),0,0);
end
data = rand(length(time),1);
plot(time,data);
set(gca,'XTick',floor(time(1:50:end))','XTickLabel',floor(DOY(1:50:end)))
Could someone suggest a method for ensuring the ticks on the xaxis are for day numbers that are multiples of 10 i.e. 110, 160 etc.

Akzeptierte Antwort

Star Strider
Star Strider am 14 Sep. 2012
Bearbeitet: Star Strider am 15 Sep. 2012
Does this do what you want (placed after your for looop)?
data = rand(length(time),1) + sin(2*pi*DOY'/365)/5;
StartDOY = 200;
InitDOYIdx = find(DOY >= StartDOY, 1, 'first')
PlotIdx = [InitDOYIdx:length(DOY)]';
plot(time(PlotIdx),data(PlotIdx));
xtiklocs = floor(time(InitDOYIdx:50:end))';
xtiklbls = 10*floor(DOY(InitDOYIdx:50:end)/10)';
set(gca,'XTick',xtiklocs,'XTickLabel',xtiklbls)
Produces:
Dates xtiklocs xtiklbls
2008 07 18 733607 200
2008 09 06 733657 250
2008 10 26 733707 300
2008 12 15 733757 350
2009 02 03 733807 30
2009 03 25 733857 80
2009 05 14 733907 130
2009 07 03 733957 180
2009 08 22 734007 230
2009 10 11 734057 280
I changed data a bit to provide a trend as a check to be sure different start times plotted appropriately. (I set it arbitrarily to start at the beginning of 2008.)
I broke out ‘xtiklocs’ and ‘xtiklbls’ as separate variables so I could keep track of them, and coded ‘xtiklbls’ to produce only multiples of 10, as you requested.
I made ‘InitDOYIdx’ the index of the first occurrence of the 200th day because you asked for that as an illustration. You can of course define it with ‘StartDOY’ to be any ‘DOY’ index that works with your data.

Weitere Antworten (1)

Azzi Abdelmalek
Azzi Abdelmalek am 14 Sep. 2012
close
time = datenum('2008-04-17 02:00'):datenum('2009-11-24 12:27');
dateV = datevec(time);
for i = 1:length(time);
DOY(i) = time(i) - datenum(dateV(i,1),0,0);
end
data = rand(length(time),1);
n=length(time)
plot(1:n,data);
set(gca,'XTick',10:50:n)
  5 Kommentare
Azzi Abdelmalek
Azzi Abdelmalek am 14 Sep. 2012
when you say 200, compared to what, what is your mark? how can we know that is 200, then we can fix our code
Richard
Richard am 15 Sep. 2012
So, the original time series is for julian date, I want to show the xaxis as day of year so I calculate 'DOY'. I then plot the data against julian date ('time') and then convert the xaxis to DOY. The day number therefore depends on the original time vector (of julian dates) which could start on any day of the year (50,200,250 and so on). Basically instead of the code you have provided above I was looking for a solution that moved the xticks to the location where the first DOY was a multiple of 10 and then did the same for the remaining ticks. Hope this makes sense.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Dates and Time finden Sie in Help Center und File Exchange

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by