【问题标题】:Datetick not showing enough tick marks in plotDatetick 在图中没有显示足够的刻度线
【发布时间】:2013-06-24 13:58:12
【问题描述】:

我有一个代码(如下),它绘制简单的 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' 格式的标签?

【问题讨论】:

  • 这是 MATLAB 最大的烦恼之一,每次都会发生

标签: matlab plot


【解决方案1】:

您的代码仅在切换了一些语句后就运行良好!诀窍是首先增加刻度数,然后然后调用 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天)

【讨论】:

  • 谢谢!我回去添加了标签和标题。
  • 您能解释一下您是如何知道使用 datenum(2009,10:1:54,1); 的吗? 10:1:54,1 部分是什么意思?
  • 10:1:54 是向量 [10,11,12,..., 53, 54]。通过在datenum 的一个输入中使用向量,输出也将是一个向量。数字 10 到 54 代表日期中的月份。 Matlab 足够聪明,可以将 12 到 24 之间的任何月份解释为“明年”,将 24 到 36 之间的任何月份解释为“两年后”,依此类推。遗憾的是,这不适用于负数月份。
  • 太好了,唯一的问题是我无法使用 XMinorTick: set(gca,'XMinorTick','on','YMinorTick','on') 。 x 上没有出现 MinorTicks。有什么线索吗?谢谢
  • 奇怪 - 它适用于我,至少在将 XMinorTicks 应用于上面的示例时。
【解决方案2】:

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

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

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

set(gcf,'Position',[xPos yPos width height]);
datetick

【讨论】:

  • 我怎样才能知道什么样的价值观会起作用?能给我举个例子吗?为什么绘图宽度会缩小?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多