如何删除重复的日期刻度标签

时间:2013-04-12 18:01:00

标签: matlab plot axis-labels

我正在尝试绘制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');

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您可以利用carryoverdatenum()功能:

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)作为年份。但有时候明确你正在做的事情并不是件坏事。