你的表情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
操作mv
,而只使用 d1(1) 作为年份)。但有时明确说明你在做什么并不是一件坏事。