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');

どうすればその問題を解決できますか?

4

2 に答える 2

3

の持ち越し機能を活用できますdatenum()

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);
于 2013-04-13T18:50:09.120 に答える
2

あなたの式xtic=xdata(1):12:xdate(end)は、12 日ごとにティックが必要であることを示しています。多くの場合、これは 2 か月 (または 3 か月) 繰り返されることを意味します。迅速で汚い解決策は

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

しかし、状況によっては 2 月を飛ばしてしまう可能性があり、何ヶ月も実行する場合は正しくありません。

これを適切に回避するには、毎月 1 日にティックを配置する必要があります。これを行う可能な方法は次のとおりです。

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"

EDIT Oleg Komarov の回答は、月の最初に目盛りを生成するためのはるかにクリーンな方法を示しています。これはdatenum、12 を超える月に対処できるという事実を使用しています。アプローチ (たとえば、 のmod操作をmv省略し、年には d1(1) のみを使用できます)。しかし、自分がしていることを明確にすることは、悪いことではない場合もあります。

于 2013-04-12T19:44:38.827 に答える