Построение данных по оси времени (даты) в matlab

У меня есть такие данные:

22.10.1980. 100  
25.10.1980. 120  
26.10.1980.  12

(только гораздо больше, и для каждой даты, несколько независимых измерений на право).

теперь это, вероятно, тривиально, но я никогда не делал ничего подобного в matlab, и у меня проблемы с поиском подобных примеров в интернете. Мне нужно построить данные по оси времени/даты показа (ось x), со всеми датами внутри (так, 23. и 24. также... для которых у меня нет измерений).

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

5 ответов


кажется, что это может быть лучше использовать datetick.


предполагая, что ваш файл данных имеет формат, указанный выше, вы можете использовать TEXTSCAN чтобы прочитать данные:

fid = fopen('data.txt','rt');
C = textscan(fid,'%s %s %s %d','Delimiter','.','CollectOutput',1);
fclose(fid);

первая ячейка C будет содержать массив строк N-by-3 (части даты) и вторую ячейку C будет содержать N-на-1 вектор измерений данных. Вы можете создать номер даты для каждого измерения, сначала объединив 3 меньшие строки в одну строку даты, а затем используя DATENUM функция:

t = datenum(strcat(C{1}(:,3),'-',C{1}(:,2),'-',C{1}(:,1)));
data = C{2};

как только у вас есть вектор чисел дат t чтобы пойти с вашим вектором измерений data, вы можете затем построить их:

plot(t,data,'*');  %# Plot the points as asterisks

теперь вы можете изменить метки оси x, чтобы показать фактические даты. Один из вариантов-использовать функцию DATETICK, легкое и элегантное решение, данное в Стивен!--10-->. Другой вариант-использовать функцию DATESTR чтобы создать метки самостоятельно, измените XTick и XTickLabel свойства текущих осей:

xpts = min(t):max(t);  %# Make a full vector, filling in missing dates
set(gca,'XTick',xpts,'XTickLabel',datestr(xpts));  %# Set axes properties

Примечание: какой бы вариант вы ни выбрали для изменения меток оси x на строки даты, вы можете столкнуться с проблемами, когда метки перекрывают друг друга, если метки слишком близко друг к другу. Вы можете исправить это, уменьшив или переместив деления вдоль оси x (изменив XTick свойство) или путем регулировать оси FontSize собственность. Если вы хотите повернуть метки, чтобы они соответствовали, вам придется стереть метки и создать новые повернутые текстовые объекты для них. Следующая подача на Обмен Файлами MathWorks делает именно это:


С помощью datenum вы можете преобразовать любую строковую дату в числовой формат на основе символов формата даты (см. справку datestr).

например все это приводит к тому же численное представление даты:

datenum('15/05/2009 21:22','dd/mm/yyyy HH:MM');
datenum('15.05.2009 21:22','dd.mm.yyyy HH:MM');
datenum('21-22 15.05.2009','HH-MM dd.mm.yyyy');
datenum('21-22 05/15.2009','HH-MM mm/dd.yyyy');
...

хорошо, что вы можете передать массив ячеек (вывод из textscan) или массив char непосредственно в datenum, и он выведет числовой массив дат.


Datetick-хороший вариант, а также datetick2, который можно найти здесь:MATLAB Central

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

Я не уверен насчет dd.мм yyyy format-вы можете использовать regexp или strrep для изменения десятичных знаков на тире, если это необходимо.


можно использовать datenum чтобы преобразовать даты в числа и построить данные, как обычно. допустим, вы помещаете вектор дат в переменную x. Теперь вы можете использовать

set(gca, 'xtick',x(1:10:end));
set(gca, 'xticklabel',datestr(x(1:10:end));

для установки тиков на оси x.