2010-01-10 39 views
7

Tôi có dữ liệu như thế này:dữ liệu Vẽ đúng thời hạn (ngày) trục trong matlab

22.10.1980. 100 
25.10.1980. 120 
26.10.1980. 12 

(chỉ nhiều hơn nữa của nó, và cho mỗi ngày, một số phép đo độc lập ở bên phải).

Bây giờ, điều này có lẽ tầm thường, nhưng tôi chưa bao giờ làm bất cứ điều gì giống như nó trong MATLAB và đang gặp sự cố khi tìm các ví dụ tương tự trực tuyến. Tôi cần phải vẽ dữ liệu trên một thời gian/hiển thị ngày trục (trục x), với tất cả các ngày bên trong (như vậy, 23. và 24. cũng ... mà tôi không có số đo).

Tôi không yêu cầu ai đó giải quyết vấn đề này cho tôi, nhưng nếu bạn có thể gợi ý nên chọn cách nào tốt nhất. Đã không bao giờ sử dụng loại dữ liệu này cho đến nay, do đó, gặp khó khăn khi tìm cách tải ngày cho người mới bắt đầu.

Trả lời

16

Dường như nó có thể là cách tốt nhất để sử dụng datetick.

+3

+1: Nice find. Tôi không biết về chức năng đó. – gnovice

+1

Đây là lỗi thời. Bây giờ bạn nên sử dụng datetime http://www.mathworks.com/help/matlab/matlab_prog/plot-dates-and-durations.html – hyprfrcb

1

Bạn có thể sử dụng datenum để chuyển đổi ngày thành số và vẽ dữ liệu như bình thường. cho phép bạn nói vectơ ngày tháng của bạn trong biến được gọi là x. Bây giờ, bạn có thể sử dụng

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

để thiết lập ve trên trục x.

4

Giả sử tập tin dữ liệu của bạn có định dạng đưa ra ở trên, bạn có thể sử dụng TEXTSCAN để đọc dữ liệu:

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

Các tế bào đầu tiên của C sẽ chứa một mảng di động N-by-3 của chuỗi (những phần của ngày) và ô thứ hai của C sẽ chứa vectơ N-by-1 của các phép đo dữ liệu. Bạn có thể tạo ra một số ngày cho mỗi lần đo bằng cách đầu tiên concatenating 3 dây nhỏ thành một chuỗi ngày và sau đó sử dụng DATENUM chức năng:

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

Một khi bạn có một vector số ngày t đi với vector của bạn đo lường data, sau đó bạn có thể vẽ chúng:

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

Bây giờ, bạn có thể thay đổi nhãn trục x để hiển thị ngày thực tế. Một lựa chọn là sử dụng hàm DATETICK, một giải pháp dễ dàng và thanh lịch được đưa ra trong steven's answer. Một lựa chọn khác là sử dụng các chức năng DATESTR để tạo ra các nhãn chính mình, sau đó sửa đổi XTickXTickLabel thuộc tính của các trục hiện tại:

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

LƯU Ý: Cho dù tùy chọn mà bạn chọn để thay đổi trục x nhãn cho các chuỗi ngày tháng, bạn có thể gặp rắc rối với các nhãn trùng nhau nếu các dấu tick quá gần nhau. Bạn có thể sửa lỗi này bằng cách giảm hoặc định vị lại các dấu tick dọc theo trục x (bằng cách thay đổi thuộc tính XTick) hoặc bằng cách điều chỉnh các trục FontSize thuộc tính. Nếu bạn muốn xoay các nhãn để làm cho chúng phù hợp, bạn sẽ phải xóa các nhãn và tạo mới text objects được xoay cho chúng.Việc nộp sau trên The MathWorks File Exchange không chỉ rằng:

2

Datetick là một lựa chọn tốt, cũng như datetick2, có thể được tìm thấy ở đây: MATLAB Central

Datetick2 phép panning và thu phóng, với điều chỉnh cho nhãn thời gian, tùy thuộc vào mức độ bạn đã phóng to.

Tôi không chắc chắn về định dạng dd.mm.yyyy - bạn có thể sử dụng regexp hoặc strrep để thay đổi số thập phân thành dấu gạch ngang nếu cần thiết.

3

Với datenum bạn có thể chuyển đổi bất kỳ ngày chuỗi thành định dạng số dựa trên các biểu tượng định dạng ngày (xem datestr trợ giúp).

Ví dụ tất cả điều này dẫn đến cùng đại diện ngày số:

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');
...

Những điều tốt đẹp là bạn có thể vượt qua mảng di động (đầu ra từ textscan) hoặc mảng char trực tiếp đến datenum và nó sẽ ra mảng ngày số.

Các vấn đề liên quan