6

我有这样的数据:

22.10.1980. 100  
25.10.1980. 120  
26.10.1980.  12

(只是更多,并且对于每个日期,右侧有几个独立的测量值)。

现在,这可能是微不足道的,但我从来没有在 MATLAB 中做过类似的事情,并且在网上找到类似的例子时遇到了问题。我需要在时间/显示日期轴(x 轴)上绘制数据,其中包含所有日期(因此,23. 和 24. 以及......我没有测量值)。

如何让日期显示在绘图轴上?

4

5 回答 5

16

似乎它可能是最好的使用datetick

用法:datetick('x')或使用文档datetick('x', dateformat)中解释的可用格式。

于 2010-01-10T20:09:40.400 回答
4

假设您的数据文件具有上面给出的格式,您可以使用它textscan来读取数据:

fid = fopen('data.txt','rt');
C = textscan(fid,'%s %s %s %d','Delimiter','.','CollectOutput',1);
fclose(fid);

的第一个单元格C将包含一个 N×3 的字符串单元格数组(日期的部分),第二个单元格C将包含一个 N×1 的数据测量向量。您可以通过首先将 3 个较小的字符串连接成一个日期字符串,然后使用以下datenum函数来为每个测量创建一个日期编号:

t = datenum(strcat(C{1}(:,3),'-',C{1}(:,2),'-',C{1}(:,1)));
data = C{2};

一旦你有一个日期数字t向量与你的测量向量一起使用data,你就可以绘制它们:

plot(t,data,'*');  %# Plot the points as asterisks

现在,您可以更改 x 轴标签以显示实际日期。一种选择是使用该功能,这是steven 的回答datetick中给出的一种简单而优雅的解决方案。另一种选择是使用该函数自己创建标签,然后修改当前轴的和属性:datestrXTickXTickLabel

xpts = min(t):max(t);  %# Make a full vector, filling in missing dates
set(gca,'XTick',xpts,'XTickLabel',datestr(xpts));  %# Set axes properties

注意:无论您选择哪个选项将 x 轴标签更改为日期字符串,如果刻度线靠得太近,您可能会遇到标签相互重叠的问题。您可以通过减少或重新定位沿 x 轴的刻度线(通过更改XTick属性)或调整轴FontSize属性来解决此问题。如果要旋转标签以使其适合,则必须擦除标签并为它们创建新的旋转文本对象MathWorks 文件交换上的以下提交就是这样做的:

于 2010-01-10T20:14:00.340 回答
3

使用 datenum,您可以根据日期格式符号将任何字符串日期转换为数字格式(请参阅帮助 datestr)。

例如,所有这些都会导致相同的数字日期表示:

datenum('15/05/2009 21:22','dd/mm/yyyy HH:MM');
datenum('15.05.2009 21:22','dd.mm.yyyy HH:MM');
datenum('21-22 15.05.2009','HH-MM dd.mm.yyyy');
datenum('21-22 05/15.2009','HH-MM mm/dd.yyyy');
...

好消息是您可以将单元格数组(从 textscan 输出)或 char 数组直接传递给 datenum,它将输出数字日期数组。

于 2010-01-12T13:19:10.023 回答
2

Datetick 是一个不错的选择,还有 datetick2,可以在这里找到:MATLAB Central

Datetick2 允许平移和缩放,并根据您放大的程度调整时间标签。

我不确定 dd.mm.yyyy 格式 - 如果需要,您可以使用 regexp 或 strrep 将小数更改为破折号。

于 2010-01-11T03:51:17.110 回答
1

您可以使用datenum将日期转换为数字,并像往常一样绘制数据。假设您将日期向量放入名为 x 的变量中。现在,您可以使用

set(gca, 'xtick',x(1:10:end));
set(gca, 'xticklabel',datestr(x(1:10:end));

设置 x 轴上的刻度。

于 2010-01-10T20:12:13.250 回答