5

我有一个代码(如下),它绘制简单的 x、y 数据。我的时间(x 轴)最初是从 1 到 1257 的数字,对应于我正在查看的天数。我将其转换为序列日期以绘制它。但是,当它在 MATLAB 中绘制时,x 轴上没有足够的标签。当我尝试设置更多刻度线时,我要么以串行格式(我想要'mmm yyyy'格式)获得标签,要么当我尝试 NumTicks 时,我得到很多标签,但它们不正确,因为它们只是原始标签重复了几次。

% Find indexes at which the lat and lon match the conditions
lon_ind = find(X(:,1) == 224); % Longitude closest to  136 03.56W
lat_ind = find(Y(1,:) == -66.75); % Latitude closest to 66 39.67S

% Pull out all the data at the point 2240W and 66.75
data_point = data_All(lon_ind, lat_ind, :); 
t = 1:1257; % Days 1:1257 inclusive. 20100101 to 20130611
y = reshape(data_point,[],1); % Change data_point into a 1 column matrix 

x = datenum(2009, 12, 31) + t; % Convert t into serial numbers

% str = datestr(x, 'mmm yyyy'); % Choose format for x-axis
plot(x, y); % Plot data

datetick('x','mmm yyyy','keeplimits', 'keepticks'); % Set parameters

% NumTicks = 30;
% L = get(gca,'XLim');
% set(gca,'XTick',linspace(L(1),L(2),NumTicks))

set(gca,'XMinorTick','on','YMinorTick','on'); % Add minor ticks (without labels)

如何使 x 轴具有更多“mmm yyyy”格式的标签?

4

2 回答 2

9

您的代码仅在切换了一些语句后运行良好!诀窍是首先增加滴答数,然后调用 datetick。

有 30 个日期标记,标签当然太拥挤了,不适合任何体面的情节。作为解决方案,我从文件交换下载了 xticklabelrotate 。

这是修改后的代码。我使用了虚拟 y 数据,以便其他人可以使用可行的示例。

t = 1:1257; % Days 1:1257 inclusive. 20100101 to 20130611
y = t.^2;
x = datenum(2009, 12, 31) + t;

str = datestr(x, 'mmm yyyy');
plot(x, y);

NumTicks = 30;
L = get(gca,'XLim');
set(gca,'XTick',linspace(L(1),L(2),NumTicks))

datetick('x','mmm yyyy','keeplimits', 'keepticks')
xticklabel_rotate;
set(gca,'XMinorTick','on','YMinorTick','on')

结果如下所示:

在此处输入图像描述

对于任何现实世界的应用程序,永远不要忘记标记轴!:-)

编辑

使用上面的代码在给定的时间段内均匀分布一些 xticks 是一个坏主意,尤其是在将它与仅给出非常“粗略”的日期的日期格式结合使用时。

相反,你应该把你的刻度放在月份的开头,否则随便的观众会被误导。

相反,我建议使用此代码:

t = 1:1257; % Days 1:1257 inclusive. 20100101 to 20130611
y = t.^2;
x = datenum(2009, 12, 31) + t;

str = datestr(x, 'mmm yyyy');
plot(x, y);

tick_locations = datenum(2009,10:1:54,1);
set(gca,'XTick',tick_locations)

datetick('x','mmm yyyy','keeplimits', 'keepticks')
xticklabel_rotate;

在这里,标签在 2009 年 10 月至 54 个月后以 1 个月的间隔间隔,这适用于 2013 年 6 月。(通过反复试验找到的数字。)

在此处输入图像描述

刻度现在总是在月初,这意味着它们之间的间隔每个月都会有所不同,这是应该的。(2月-3月28天,3月-4月31天)

于 2013-06-24T14:22:47.853 回答
0

我用于此问题的快速解决方法是在应用 datetick 之前增加绘图的宽度。

然后可以根据需要减小绘图宽度。

这个解决方案有点狡猾,而且不如 Martin 的解决方案那么强大。

set(gcf,'Position',[xPos yPos width height]);
datetick
于 2014-05-03T01:31:15.590 回答