Отображение данных на оси времени (даты)

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

22.10.1980. 100  
25.10.1980. 120  
26.10.1980.  12

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

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

Как я могу заставить даты отображаться на оси графика?


person Rook    schedule 10.01.2010    source источник


Ответы (5)


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

Использование: datetick('x') или datetick('x', dateformat) в доступных форматах, как описано в документации.

person monksy    schedule 10.01.2010
comment
Это устарело. Теперь вы должны использовать datetime mathworks.com/help/matlab /matlab_prog/ - person Brethlosze; 08.07.2016

Предполагая, что ваш файл данных имеет указанный выше формат, вы можете использовать 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 делает именно это:

person gnovice    schedule 10.01.2010

С помощью 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) или массив символов непосредственно в datenum, и он выведет числовой массив дат.

person Community    schedule 12.01.2010

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

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

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

person Doresoom    schedule 11.01.2010

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

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

установить галочки на оси x.

person Ofri Raviv    schedule 10.01.2010