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

时间:2010-01-10 19:52:17

标签: matlab

我有这样的数据:

22.10.1980. 100  
25.10.1980. 120  
26.10.1980.  12

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

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

我不是要求有人为我解决这个问题,但是如果你能暗示哪种方式应该是最好的。到目前为止从未使用过这种数据类型,因此无法找到为初学者加载日期的方法。

5 个答案:

答案 0 :(得分:15)

似乎最好使用datetick

答案 1 :(得分:4)

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

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

C的第一个单元格将包含N-by-3单元格的字符串数组(日期的部分),C的第二个单元格将包含N-by-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轴标签以显示实际日期。一种选择是使用函数DATETICK,这是steven's answer中给出的简单而优雅的解决方案。另一个选择是使用函数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提交的内容就是:

答案 2 :(得分:3)

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

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

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,它将输出数字日期数组。

答案 3 :(得分:2)

Datetick是一个很好的选择,以及datetick2,可以在这里找到:MATLAB Central

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

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

答案 4 :(得分:1)

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

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

设置x轴上的刻度。