Построение данных по оси времени (даты) в Matlab - PullRequest
6 голосов
/ 10 января 2010

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

22.10.1980. 100  
25.10.1980. 120  
26.10.1980.  12

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

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

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

Ответы [ 5 ]

15 голосов
/ 10 января 2010

Кажется, что лучше всего использовать datetick .

4 голосов
/ 10 января 2010

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

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

Первая ячейка C будет содержать массив строк размером N × 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 , простое и элегантное решение, приведенное в ответе Стивена . Другой вариант - использовать функцию 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 File Exchange делает именно это:

3 голосов
/ 12 января 2010

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

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

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

Приятно то, что вы можете передавать массив ячеек (вывод от textcan) или массив символов непосредственно в datenum, и он будет выводить числовой массив дат.

2 голосов
/ 11 января 2010

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

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

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

1 голос
/ 10 января 2010

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

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

, чтобы установить отметки на оси X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...