【问题标题】:How to put date ticks on x axis in Matlab?如何在 Matlab 的 x 轴上放置日期刻度?
【发布时间】:2014-10-08 18:31:42
【问题描述】:

我有一个由两列组成的文本文件,第一列包含日期(格式为 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

【问题讨论】:

  • 如果您要绘制的每个点都有与之关联的日期,则创建一个日期向量,其中第 i^th 元素是与您要绘制的第 i^th 点关联的日期。一般来说,当您调用plot( x, y ) 时,x 中的元素数量必须与y 中的元素数量相同。

标签: matlab date plot


【解决方案1】:

最好的办法是首先正确导入您的日期向量。所以你会得到一个与数据长度相同的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

【讨论】:

  • 谢谢。听起来很完美,我已经尝试过这个,现在只是另一个问题,即 x 轴分为 1996、1997、2000、2001、2004、2005、2008 我怎样才能像 1996 年一样获得所有年份或至少 2 年,1998,2000,2002,2004,2006,2008 ?关于 NAN 字符,是的,就是这样,它取决于 H ,如果 H=12 那么我想最后有 12 个 NAN 字符,一开始有 11 个 NAN 字符:)
  • @Singu,我编辑了答案以解决您的刻度间距问题。
  • 谢谢!这是完美的。
【解决方案2】:

除了 AnonSubmitter85 的评论,我想说你必须在生成绘图后使用 datetick 函数。我认为您需要采取的步骤是:

  1. 使用 importdata 将日期数据导入为字符串单元格。
  2. 通过将该元胞数组传递给 datenum 函数来创建一个串行时间向量:

    datevect = datenum(cellofdatestrings, 'yyyy-mm')

  3. 调用绘图函数: 绘图(datevect,ydata)
  4. 将日期字符串应用于轴的刻度线 datetick('x', 'yy-mm')

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多