我有这样的数据:
22.10.1980. 100
25.10.1980. 120
26.10.1980. 12
(只是更多,并且对于每个日期,右侧有几个独立的测量值)。
现在,这可能是微不足道的,但我从来没有在 MATLAB 中做过类似的事情,并且在网上找到类似的例子时遇到了问题。我需要在时间/显示日期轴(x 轴)上绘制数据,其中包含所有日期(因此,23. 和 24. 以及......我没有测量值)。
如何让日期显示在绘图轴上?
我有这样的数据:
22.10.1980. 100
25.10.1980. 120
26.10.1980. 12
(只是更多,并且对于每个日期,右侧有几个独立的测量值)。
现在,这可能是微不足道的,但我从来没有在 MATLAB 中做过类似的事情,并且在网上找到类似的例子时遇到了问题。我需要在时间/显示日期轴(x 轴)上绘制数据,其中包含所有日期(因此,23. 和 24. 以及......我没有测量值)。
如何让日期显示在绘图轴上?
似乎它可能是最好的使用datetick
。
用法:datetick('x')
或使用文档datetick('x', dateformat)
中解释的可用格式。
假设您的数据文件具有上面给出的格式,您可以使用它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
中给出的一种简单而优雅的解决方案。另一种选择是使用该函数自己创建标签,然后修改当前轴的和属性:datestr
XTick
XTickLabel
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 文件交换上的以下提交就是这样做的:
使用 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,它将输出数字日期数组。
Datetick 是一个不错的选择,还有 datetick2,可以在这里找到:MATLAB Central
Datetick2 允许平移和缩放,并根据您放大的程度调整时间标签。
我不确定 dd.mm.yyyy 格式 - 如果需要,您可以使用 regexp 或 strrep 将小数更改为破折号。
您可以使用datenum将日期转换为数字,并像往常一样绘制数据。假设您将日期向量放入名为 x 的变量中。现在,您可以使用
set(gca, 'xtick',x(1:10:end));
set(gca, 'xticklabel',datestr(x(1:10:end));
设置 x 轴上的刻度。