我有一个由两列组成的文本文件,第一列包含日期(格式为yyyy-mm),第二列是整数。文本文件是2 * 144的矩阵,如下所示:
1996-06 23
1996-07 53
1996-08 12
1996-09 21
...
通过importdata我只读了文件的第二列,我在第二列上做了一些操作,但最后它们仍然是144.我可以在x轴上用随机数绘制结果,但是我无法在x轴,因为我需要一个相同大小的矢量,但我只想在1996年到2007年的12年内,而不是x轴上的所有月份。 我是MATLAB的新手,我将不胜感激。
以下是我的代码和错误的完整版本,我发现问题在于我需要一个1 * 144的矩阵表示日期: Ploting dates on x-axis in octave
答案 0 :(得分:2)
最好的办法是首先正确导入日期向量。因此,您获得的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
命令可能会重置您的勾选否则)
如上所述,这只会显示年份,但由于您导入了原始日期/时间值,您还可以选择不同的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
,这也会显示月份和年份。
编辑: 根据评论完成答案。默认情况下,Matlab会自动分隔刻度线,网格线和标签,尽量不要在每个数据点添加勾号来重载图形。如果要覆盖此行为并控制刻度线的确切间距或位置,则必须告诉Matlab将它们放在何处。
为此,我们将根据您的喜好定义一个日期向量,然后告诉matlab仅在这些位置绘制刻度。
1
您可以将年份步骤更改为datetick
或任何看起来适合您身材的内容。如果你这样做,请忘记上面解决方案中的最后两行代码。我们不需要再使用XTickLabel
,因为我们在强制其位置的同一行设置了刻度线(XTick
)(通过设置{{1}})。
如果要修改输出格式,请查看不同的datestr format。
答案 1 :(得分:1)
除了AnonSubmitter85的评论之外,我想说你必须在生成情节后使用函数datetick。我认为您需要采取的步骤是:
datevect = datenum(cellofdatestrings,' yyyy-mm')