在时间(日期)轴上绘制数据

6

我有这样的数据:

22.10.1980. 100  
25.10.1980. 120  
26.10.1980.  12

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

现在,这可能很琐碎,但我从未在MATLAB中做过类似的事情,并且在网上找不到类似的示例。 我需要在时间/日期轴(x轴)上绘制数据,并显示所有日期(因此,23和24也是如此...但我没有测量值)。

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

5个回答

16

看起来最好使用datetick

用法:datetick('x')datetick('x', dateformat),可使用文档中说明的可用格式。(文档链接)


2
这已经过时了。现在你应该使用datetime。http://www.mathworks.com/help/matlab/matlab_prog/plot-dates-and-durations.html - Brethlosze

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};

一旦你有一个日期数值的向量与你的测量数据向量相对应,你就可以将它们绘制出来:
plot(t,data,'*');  %# Plot the points as asterisks

现在,您可以更改 x 轴标签以显示实际日期。一种选项是使用函数 datetick,这是一个简单而优雅的解决方案,如Steven 的答案所述。另一种选项是使用函数datestr自己创建标签,然后修改当前轴的 XTickXTickLabel 属性。
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属性来解决此问题。如果您想旋转标签以使其适合,则必须擦除标签并为它们创建新的旋转text objects。以下在The MathWorks File Exchange上提交的内容就是这样做的:

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输出)或字符数组传递给datenum,它将输出数字日期数组。

2
Datetick是一个不错的选择,Datetick2也很好用,可以在这里找到:MATLAB Central
Datetick2允许平移和缩放,并根据缩放程度调整时间标签。
我不确定dd.mm.yyyy格式是否可行 - 如果有必要,您可以使用regexp或strrep将小数点替换为破折号。

1

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

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

设置 x 轴上的刻度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接