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

3 ビュー (過去 30 日間)
Richard
Richard 2012 年 9 月 14 日
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.

採用された回答

Star Strider
Star Strider 2012 年 9 月 14 日
編集済み: Star Strider 2012 年 9 月 15 日
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.

その他の回答 (1 件)

Azzi Abdelmalek
Azzi Abdelmalek 2012 年 9 月 14 日
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 件のコメント
Azzi Abdelmalek
Azzi Abdelmalek 2012 年 9 月 14 日
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 2012 年 9 月 15 日
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.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeCalendar についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by