我正在尝试绘制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 :(得分:3)
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 :(得分: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"
编辑 Oleg Komarov的回答指出了一种更清洁的方式来产生每月初的抽搐 - 这是因为datenum
可以应对大于12的月份。通过使用这种方法可能使上面的代码更紧凑和更清晰(例如,你可以省略mod
的{{1}}操作,并且只使用d1(1)作为年份。但有时候明确你正在做的事情并不是件坏事。