我正在尝试在一张图中绘制两个时间序列。不幸的是,这些数据集具有不同的时间分辨率,并且我使用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
答案 0 :(得分:0)
最后两个命令实际上可以工作,但是不幸的是,刻度线位于图形之外的另一个位置。您的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刻度值很多,因此您可能需要更改刻度格式或放大特殊部分。
如果您需要在这一领域做更多的工作,建议您考虑一下MATLAB datetime
格式,我发现它比datenum
更好用。
答案 1 :(得分:0)
我对您的代码进行了概括,并使用了比随机数更好的检查方法。我删除了标签部分以使脚本简短。
% 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;
原则上,这应该起作用,但是由于刻度线标签较长,因此输出效果不佳。如果可以的话,请您检查一下您想要实现的目标?