Построение данных по оси времени (даты) в matlab
У меня есть такие данные:
22.10.1980. 100
25.10.1980. 120
26.10.1980. 12
(только гораздо больше, и для каждой даты, несколько независимых измерений на право).
теперь это, вероятно, тривиально, но я никогда не делал ничего подобного в matlab, и у меня проблемы с поиском подобных примеров в интернете. Мне нужно построить данные по оси времени/даты показа (ось x), со всеми датами внутри (так, 23. и 24. также... для которых у меня нет измерений).
Я не прошу кто-то, чтобы решить это для меня, но если бы вы могли намекнуть, какой путь должен быть лучшим. Никогда не использовал этот тип данных до сих пор, поэтому у меня возникли проблемы с поиском способа загрузки дат для начала.
5 ответов
предполагая, что ваш файл данных имеет формат, указанный выше, вы можете использовать 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.