datetime matlab разное временное разрешение

Я пытаюсь построить два временных ряда на одном графике. К сожалению, наборы данных имеют разное временное разрешение, и мой код с использованием 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

person Lisa Mills    schedule 06.03.2019    source источник


Ответы (2)


Я немного обобщил ваш код и использовал что-то более приятное для проверки, чем случайные числа. Я удалил часть маркировки, чтобы сценарий был коротким.

% 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;

В принципе, это должно работать, но вывод не очень приятный из-за длинных галочек. Не могли бы вы проверить, если это так, чего вы хотели достичь?

person HansHirse    schedule 06.03.2019

Последние две команды действительно работают, но, к сожалению, галочки находятся не в том месте, где находится график. Ваши значения x1x2) находятся в диапазоне от 1 до 230, в то время как значения xData для тактов составляют около 730000. Если вы выберете значения x для графика в значениях datenum, это сработает.
Другая проблема заключается в том, что длина векторы не складываются в значения каждые 15 минут (или 1 час). Если вам нужны значения каждые 15 минут для временного промежутка с 19/02 09:00 до 21/02 18:00 (всего 57 часов), вам нужно:

4(1/ч)*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 — это много, поэтому вы можете изменить формат Tick или увеличить конкретную часть. Если вам нужно проделать больше работы в этой области, я рекомендую вам изучить формат MATLAB datetime, который я считаю немного лучше, чем datenum.

person Finn    schedule 06.03.2019
comment
Похоже, у нас очень похожие решения; не видел твоего, прежде чем ответить. Но у вас есть тики только для (33/34) часов dataset2, верно? Насколько я понимаю, нужны почасовые тики за весь период времени!? (dataset1 на один день больше, чем dataset2.) - person HansHirse; 06.03.2019
comment
я думаю, что если вы хотите сравнить наборы данных, нужны только тики в меньшем, но нет недостатка в создании тиков для более длинного набора данных. Также это может пригодиться, если вы прокрутите его позже. Хорошая идея! Я редактирую свое решение - person Finn; 06.03.2019