У меня есть данные как это:
22.10.1980. 100
25.10.1980. 120
26.10.1980. 12
(только намного больше из него, и для каждой даты, несколько независимых измерений справа).
Теперь, это, вероятно, тривиально, но я никогда не делал ничего как он в MATLAB, и имею проблемы при нахождении подобных примеров онлайн. Я должен отобразить данные на графике по оси дат времени/показа (ось X) со всеми датами внутри (так, 23. и 24. также..., для которого у меня нет измерений).
Как я могу заставить даты обнаруживаться на оси графика?
Похоже, что лучше всего использовать фишку
.
Использование: datetick('x')
или datetick('x', формат данных)
с доступными форматами, как описано в документации .
Предполагая, что ваш файл данных имеет приведенный выше формат, вы можете использовать Textscan
для чтения данных:
fid = fopen('data.txt','rt');
C = textscan(fid,'%s %s %s %d','Delimiter','.','CollectOutput',1);
fclose(fid);
первая ячейка C
Содержит N-BY-3 клеточного массива строк (части даты), а вторая ячейка C
будет содержать вектор N-BY-1 измерений данных. Вы можете создать номер даты для каждого измерения, сначала соединяя 3 меньших строки в одну строку даты, а затем с помощью функции TANENUM
:
t = datenum(strcat(C{1}(:,3),'-',C{1}(:,2),'-',C{1}(:,1)));
data = C{2};
Как только у вас есть вектор номеров даты T
Чтобы пойти с вашим вектором измерений данные
, вы можете затем построить их:
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 делает только что:
DateTick является хорошим вариантом, а также DateTick2, который можно найти здесь: MATLAB Central
dateTick2 позволяет панорамировать и масштабировать, с регулировками к меткам времени, в зависимости от того, как далеко вы увеличены [
Я не уверен в формате dd.mm.yyyy - вы можете использовать Regexp или strrep, чтобы изменить десятичные дроби, если необходимо, если необходимо.
Вы можете использовать TANENUM , чтобы преобразовать даты номера и построить данные как обычно. Позвольте сказать, что вы поместите ваши даты вектора в переменной под названием X. Теперь вы можете использовать
set(gca, 'xtick',x(1:10:end));
set(gca, 'xticklabel',datestr(x(1:10:end));
, чтобы установить галочки на оси X.
С DateNum вы можете преобразовать любую строку дату в числовой формат на основе символов формата даты (см. Справка DateStr).
Например, все это приводит к тому же численному представлению даты:
TANENUM ('15 / 05/2002 21:22 ',' dd / mm / yyyy hh: mm ');
datenum ('15 .05.2009 21:22 ',' dd.mm.yyyyy 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, и он выводится числовой массив даты.