最好的办法是首先正确导入您的日期向量。所以你会得到一个与数据长度相同的time 向量。
为此,您可以使用textscan(而不是importdata),它为您提供更多控制权。因此,查看您在上一个问题中详述的代码,通过执行以下操作导入您的数据:
%% // Import your data (textscan gives you more control)
fid = fopen( '2.txt' , 'r') ; %// open your file
data = textscan(fid,'%s %f') ; %// import the content
fclose(fid) ; %// close the file
%% // parse your variables
time = datenum( data{:,1} , 'yyyy-mm' ) ; %// convert text strings into matlab serial date format
C = data{:,2} ; %// isolate your variable
之后,C 中的变量与 importdata 中的变量相同,但变量 time 中也有原始时间向量(相同的长度)
然后运行您的计算代码(这里不再重复,只是您编写的相同代码)。然后在显示的时候,使用:
%% // display the results
f = figure;
plot( time , C , '.');
hold on
plot( time , L_Tilde, 'g-.');
plot( time , U_Tilde, 'g-.');
dateFormat = 10;
datetick('x',dateFormat)
提示:在绘图后使用datetick 指令(否则plot 命令可能会重置您的刻度)
正如所写,这只会显示年份,但由于您导入了原始日期/时间值,您还可以选择不同的dateFormat,它也会显示月份和年份。
编辑:
根据评论完成答案。默认情况下,Matlab 自动间隔刻度线、网格线和标签,尽量不通过在每个数据点添加刻度来使图形过载。如果您想覆盖此行为并控制刻度的确切间距或位置,您必须告诉 Matlab 将它们放置在何处。
为此,我们将根据您的喜好定义一个日期向量,然后告诉 matlab 仅在这些位置绘制刻度。
tickStep = 2 ; %// choose the number of years you want
tickDates = datenum( 1996:tickStep:2008 ,1,1) ; %// creates a vector of tick positions
set(gca, 'XTick' , tickDates , 'XTickLabel' , datestr(tickDates,'yyyy') ) %// set the position and label of each tick
您可以将年份步长更改为1 或任何适合您身材的东西。如果您这样做,请忘记上面解决方案中的最后两行代码。无需再使用datetick,因为我们将刻度字符串(XTickLabel)设置在我们强制其位置的同一行(通过设置XTick)。
如果要修改输出格式,请查看不同的datestr format。