2013-04-12 35 views
0

我想要繪製63年月度數據和一些標籤重複(用箭頭表示),通過如下圖所示:如何刪除重複的日期刻度標記

爲了處理x標籤,我用了以下代碼:

xdate = datenum (datestring2, 'yyyy/mm'); 
plot (xdate,data1.data(:,4), 'b', xdate,data1.data(:,6),'r', ... 
xdate,data1.data(:,8),'k', xdate,data1.data(:,10),'g'); 
xtic=xdate(1):12:xdate(end); 
set(gca,'XTick',xtic); 
datetick('x', 'mm/yyyy', 'keepticks'); 

我該如何解決這個問題?

+0

看起來可以只通過在線'xtic = xdate改變步長大小做到這一點(1):12:xdate(端);'。例如:'xtic = xdate(1):24:xdate(end);' – wakjah

+0

是否需要'keepticks'? – yuk

回答

3

您可以利用的datenum()carryover功能:

out = datenum(2000,1:14,1); 

我們來驗證:

datestr(out) 
ans = 
01-Jan-2000 
01-Feb-2000 
01-Mar-2000 
01-Apr-2000 
01-May-2000 
01-Jun-2000 
01-Jul-2000 
01-Aug-2000 
01-Sep-2000 
01-Oct-2000 
01-Nov-2000 
01-Dec-2000 
01-Jan-2001 
01-Feb-2001 

現在它們設置爲Xtick

set(gca,'Xtick',out) 

編輯:使用開始結束日期

% Provide example initial and final date 
in = '20100324'; 
fi = '20130215'; 

% Decompose with datevec, count number of months, and skip one month if day > 1 
infi = datevec({in,fi},'yyyymmdd'); 
nmonths = diff(infi(:,1:2))*[12 1]' + infi(1,2); 
skipone = infi(1,3) ~= 1; 

% Calculate dates 
out = datenum(infi(1), (infi(1,2) + skipone):nmonths, 1); 
+1

+1教我關於遺留物。當我寫我的(令人費解的)代碼時,我想「如果... ...不會很好」,但從來沒有想過要檢查。你的解決方案絕對比我的更清潔。 – Floris

+0

@Oneg Komarov的交錯是非常簡單的事情。它效果很好!謝謝! –

+1

我很高興看到@SauloCarvalho決定改變他的投票結果並接受我的答案 - 儘管我認爲這將很好地展示這將如何實際完成他的情況(任意開始和結束日期在中間某處一年)。我試圖通過修改我的答案來做到這一點......它並沒有比我所做的更清潔!考慮它是一個挑戰:-) – Floris

2

您的表達xtic=xdata(1):12:xdate(end)表示您希望每12天打一個嘀嗒;通常這意味着你會得到兩個(甚至三個)重複的月份。一個快速和骯髒的解決辦法是

xtic = xdata(1):30:xdate(end); 

但在某些情況下,這可能會跳過二月,當你運行了大量的幾個月將是錯誤的。

爲了正確解決這個問題,您需要在每個月的第一天放置蜱蟲。一種可能的方式做到這一點是這樣的:

xdate = datenum(datestring2, 'yyyy/mm'); 
d1 = datevec(xdate(1)); % [year, month, date, hour, min, sec] 
d2 = datevec(xdate(end)+30); % one month past the last data point 
nm = ceil((xdate(end) - xdate(1))*12/365); % whole number of months 
mv = mod((1:nm) + d1(2) - 2, 12) + 1; % months 
yv = d1(1) + floor(((1:nm) + d1(2) - 1)/12); % years 
ymdv = [yv' mv' ones(nm,1)]; % year, month, day for each tic 
xtic = datenum(ymdv); % will turn this into "the first of every month" 

編輯奧列格·科馬羅夫的答案指向一個更清潔,以產生在每月的第一天的抽動方式 - 這是使用的事實,datenum可以用幾個月更大的應對你可以使用這種方法使上面的代碼變得更緊湊和更簡潔(例如,你可以省略mvmod操作,並且在一年中只使用d1(1))。但有時明確你所做的事並不是壞事。

+0

是的,正是我需要的。我不知道二月,這就是爲什麼蜱不符合y值。大!!非常感謝! –

+0

很高興它的工作。你非常歡迎。 – Floris