【问题标题】:datetime matlab different temporal resolutiondatetime matlab不同的时间分辨率
【发布时间】:2019-03-06 07:24:28
【问题描述】:

我试图在一张图中绘制两个时间序列。不幸的是,数据集具有不同的时间分辨率,我使用datetime 的代码不起作用。我的目标是每小时一个xtick。知道如何解决这个问题吗?谢谢!

dataset1 = rand(1,230).';
dataset2 = rand(1,33).';

xstart = datenum('19/02 09:00','dd/mm HH:MM');
xend = datenum('21/02 18:00','dd/mm HH:MM');
x = linspace(xstart,xend,20);
Dat = linspace(xstart,xend,numel(dataset1));
x1=[1:1:230].' %values every 15 minutes


x0_OM = datenum('19/02 09:00','dd/mm HH:MM');
x1_OM = datenum('20/02 18:00','dd/mm HH:MM');
xData = linspace(x0_OM,x1_OM,20);
Dat2 = linspace(xstart,xend,numel(dataset2));
x2=[1:4:130].' %hourly values


fig=figure ();

yyaxis left
plot(x1,dataset1);
ylabel('Dataset 1')
xlabel('timesteps (15min Interval)');
yyaxis right
plot(x2,dataset2);
ylabel('Dataset 2')
set(gca,'XTick', xData) %does not work
datetick('x', 'dd/mm HH:MM', 'keeplimits','keepticks') %does not work

【问题讨论】:

    标签: matlab datetime plot resolution temporal


    【解决方案1】:

    我稍微概括了您的代码,并使用了比随机数更好的检查方法。我删除了标签部分以保持脚本简短。

    % Dataset 1, 15 minutes interval
    xstart1 = datenum('19/02 09:00','dd/mm HH:MM');
    xend1 = datenum('21/02 18:00','dd/mm HH:MM');
    Dat1 = xstart1:1/24/4:xend1;                           % 1/24/4 is a 15 minutes step
    dataset1 = sin(linspace(0, 2*pi, numel(Dat1)));
    
    % Dataset 2, 1 hour interval
    xstart2 = datenum('19/02 09:00', 'dd/mm HH:MM');
    xend2 = datenum('20/02 18:00', 'dd/mm HH:MM');
    Dat2 = xstart2:1/24:xend2;                             % 1/24 is a 1 hour step 
    dataset2 = cos(linspace(0, 2*pi, numel(Dat2)));
    
    % Determine "global" start and end.
    xstart = min(xstart1, xstart2);
    xend = max(xend1, xend2);
    Dat = xstart:1/24:xend;
    
    % Plot
    fig = figure();
    hold on;
    plot(Dat1, dataset1, '*');
    plot(Dat2, dataset2, 'r*');
    set(gca, 'XTick', Dat);
    datetick('x', 'dd/mm HH:MM', 'keepticks', 'keeplimits');
    hold off;
    

    原则上,这应该可以,但输出不好,因为刻度标签很长。您能否检查一下,如果是,您想要实现什么?

    【讨论】:

      【解决方案2】:

      最后两个命令确实有效,但不幸的是,刻度与图表的位置不同。您的 x1(和 x2)值介于 1 到 230 之间,而刻度的 xData 值约为 730000。如果您在 datenum 值处选择绘图的 x 值,则它可以工作。
      另一个问题是向量的长度不等于每 15 分钟(或 1 小时)的值。如果您想要从 19/02 09:00 到 21/02 18:00(总共 57 小时)的时间跨度每 15 分钟的值,您需要:

      4(1/h)*57(小时) + 最后一个值的 1 = 229 个值

      或一般来说:

      (时间跨度/时间窗口) + 1

      如果你将这些更改应用到你的代码中,你会得到

      dataset1 = rand(1,229).';
      dataset2 = rand(1,34).';
      
      xstart = datenum('19/02 09:00','dd/mm HH:MM');
      xend = datenum('21/02 18:00','dd/mm HH:MM');
      
      % in datenumformat 1 = 24 hours
      fifteenminutes=(1/24/4);%15 minutes
      spacing_in_15min=((xend-xstart)/fifteenminutes)+1;%duration devided by timewindow, +1 for last value
      x1 = linspace(xstart,xend,spacing_in_15min); %values every 15 minutes
      
      x0_OM = datenum('19/02 09:00','dd/mm HH:MM');
      x1_OM = datenum('20/02 18:00','dd/mm HH:MM');
      onehour=1/24; %one hoour
      spacing_in_1hour=((x1_OM-x0_OM)/onehour)+1;%duration devided by timewindow, +1 for last value
      x2 = linspace(x0_OM,x1_OM,spacing_in_1hour); %hourly values
      tickvalues = linspace(xstart,xend,((xend-xstart)/onehour)+1);
      
      fig=figure ();
      
      yyaxis left
      plot(x1,dataset1);
      ylabel('Dataset 1')
      xlabel('timesteps (15min Interval)');
      yyaxis right
      plot(x2,dataset2);
      ylabel('Dataset 2')
      set(gca(1),'XTick', tickvalues); %Ticks every hour for the larger dataset
      set(gca(1),'XLim', [x2(1) x2(end)]); %focus on the time with both datasets
      datetick('x', 'dd/mm HH:MM', 'keeplimits','keepticks'); %Tickformat
      

      我认为这正是您想要的。我删除了一些未使用的值 (x,Dat,xData)。不幸的是,即使在全屏模式下 34 Tick 值也很多,因此您可能想要更改 Tickformat 或放大特殊部分。 如果您必须在这方面做更多工作,我建议您研究 MATLAB datetime 格式,我发现它比 datenum 更好处理。

      【讨论】:

      • 看起来我们有非常相似的解决方案;在回答之前没有看到你的。但是,您只有 dataset2 的 (33/34) 小时内的刻度,对吗?据我了解,需要整个时间段的每小时滴答声!? (dataset1dataset2 长一天。)
      • 我认为如果你想比较数据集,只需要较小的刻度,但是为较长的数据集创建刻度没有缺点。如果您稍后在其中滚动,它也可能会派上用场。好主意!我正在编辑我的解决方案
      猜你喜欢
      • 2019-03-21
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 2010-09-08
      • 2011-01-02
      • 1970-01-01
      相关资源
      最近更新 更多