2010-06-04 51 views
21

Tôi biết điều này thực sự là cơ bản, nhưng tôi mới làm quen với MATLAB. Sau khi mở tệp .fig, làm cách nào bạn thực sự làm việc với dữ liệu được vẽ trong cửa sổ lệnh? Tất cả những gì tôi thấy là cốt truyện. Tôi không chắc chắn làm thế nào để thực sự có được dữ liệu.Làm cách nào để trích xuất dữ liệu từ tệp .fig trong MATLAB?

+1

Câu hỏi hay, nhưng tôi muốn thay đổi tiêu đề để cụ thể hơn. – yuk

+0

@yuk: Hỏi và các bạn sẽ nhận được. ;) – gnovice

Trả lời

2

Sử dụng lệnh HGLOAD. Tài liệu tham khảo có sẵn here.

10

Thử tải hgload và sau đó xoay quanh cấu trúc xử lý đồ họa mà nó trả về. Ví dụ, nếu bạn vẽ và lưu như sau:

x=0:.01:10; 
y=sin(x); 
h=plot(x,y); 
saveas(h,'testfigure.fig'); 

rõ ràng không gian làm việc của bạn, và mở hình lưu sử dụng hgload:

clear 
close all 
h=hgload('testfigure.fig'); 

Bạn có thể kiểm tra của nhân vật xử lý h bằng cách gọi

get(h) 

Hoặc đi sâu hơn nữa vào trục/tiêu đề/truyền thuyết bằng cách gọi

ch=get(h,'Children'); 

Nếu bạn đang sử dụng mã trong ví dụ của tôi, bạn chỉ nên có một con cho hình, đó sẽ là các trục. Gọi cho trẻ em của các trục, và bạn nên có một dòng.

l=get(ch,'Children'); 

Tiếp theo, hãy gọi trường 'Xdata' và 'Ydata' của dòng và bạn có dữ liệu gốc.

x=get(l,'Xdata'); 
y=get(l,'Ydata'); 

Nếu bạn có con số phức tạp hơn so với chỉ trục, nó sẽ khó khăn hơn một chút. Bạn sẽ cần khám phá từng đứa trẻ để xác định xem đó có phải là cốt truyện bạn muốn trích xuất dữ liệu hay không.

+1

Bạn cũng có thể sử dụng [FINDOBJ] (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/findobj.html) chức năng để tìm kiếm một đối tượng đồ họa với một tập hợp các cặp tham số-giá trị nhất định thay vì phải bước theo cách của bạn thông qua phân cấp cha-con. Điều này sẽ có hiệu quả nhất nếu thuộc tính ''Tag'' của các đối tượng được đặt thành số nhận dạng duy nhất * trước * được lưu dưới dạng tệp .fig. – gnovice

+4

Bạn chỉ có thể tìm kiếm các tay cầm trực tiếp (mặc dù bạn nên đóng chú giải trước). Ví dụ: 'lineH = findobj (h, 'type', 'line')'. Nếu bạn có nhiều dòng và bạn chỉ muốn dòng màu đỏ, bạn có thể sử dụng 'findobj' với nhiều tiêu chí tìm kiếm, chẳng hạn như' redLineH = findobj (h, 'type', 'line', 'color', 'r') ; ' – Jonas

+0

@gnovice và @Jonas - Tôi nghĩ rằng tôi đã chạy qua findobj trước đây, nhưng tôi thậm chí không nghĩ đến việc áp dụng nó vào tình huống này. Đề xuất tuyệt vời! – Doresoom

12

Đây là cách thực sự đơn giản:

Nhấp vào đối tượng bạn muốn lấy dữ liệu. Sẽ không có dấu hiệu cho thấy bạn đã nhấp vào nó.

>> xd = get(gco,'XData'); 
>> yd = get(gco,'YData'); 

Đôi khi khó có thể nhấp vào dòng hoặc chính đối tượng khác. Nếu bạn có vấn đề này, nhấp chuột vào các trục có chứa (các) con bạn quan tâm, sau đó:

>> kids = get(gca,'Children'); 

này sẽ cung cấp cho bạn một loạt các xử lý cho trẻ em khác nhau. Bạn có thể thử tìm từng tệp một bằng cách lập chỉ mục cho trẻ em hoặc sử dụng thông tin sau để nhận tất cả dữ liệu cùng một lúc. Điều này sẽ trả lại kết quả dưới dạng mảng ô, có thể hơi phức tạp nếu bạn chưa sử dụng chúng trước đây:

>> xd = get(kids,'XData'); 
>> yd = get(kids,'YData'); 
>> xd1 = xd{1}; %# X Data from first line 
17

Thực ra, bạn thậm chí không cần phải hiển thị hình để lấy dữ liệu . Các tệp FIG được lưu trữ ở định dạng Matlab MAT chuẩn, mà bạn có thể đọc bằng chức năng tích hợp sẵn tải(). Số liệu xử lý và dữ liệu được lưu trữ trong một cấu trúc mà bạn có thể dễ dàng hiểu và xử lý.

+2

Tôi đã đăng một bài viết chi tiết về điều này: http://undocumentedmatlab.com/blog/fig-files-format/ –

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