2010-06-04 6 views
21

Я знаю, что это действительно базовый, но я новичок в MATLAB. После открытия файла .fig, как вы на самом деле работаете с построенными данными в окне команд? Все, что я вижу, это сюжет. Я не уверен, как получить данные.Как извлечь данные из файла .fig в MATLAB?

+1

Хороший вопрос, но я бы изменил название, чтобы быть более конкретным. – yuk

+0

@yuk: Просите, и вы получите. ;) – gnovice

ответ

2

Используйте команду HGLOAD. Доступна справочная информация here.

10

Попробуйте hgload, а затем просуньте вокруг структуры дескриптора графики, которую он возвращает. Например, если участок и сохранить следующее:

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

Очистите рабочее пространство, и откройте сохраненный рисунок с помощью hgload:

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

Вы можете осмотреть фигуры ручки час по телефону

get(h) 

Или углубиться в осями/названиями/легендами по телефону

ch=get(h,'Children'); 

Если вы используете код в моем примере, у вас должен быть только один ребенок для фигуры, который будет осями. Назовите детей осей, и у вас должна быть одна линия.

l=get(ch,'Children'); 

Далее вызовите «XData» и поля «Ydata» на линии, и у вас есть исходные данные.

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

Если у вас более сложная фигура, чем просто оси, она становится немного более жесткой. Вам нужно будет изучить каждого ребенка, чтобы определить, является ли это сюжет, из которого вы хотите извлечь данные.

+1

Вы также можете использовать [FINDOBJ] (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/findobj.html) для поиска графического объекта с заданным набором пар параметров-значений вместо того, чтобы пройти свой путь через иерархию parent-child. Это было бы наиболее эффективно, если бы свойства '' Tag '' объектов были установлены на уникальные идентификаторы * до того, как * будет сохранен как файл .fig. – gnovice

+4

Вы можете просто искать линейные ручки напрямую (хотя сначала вы должны закрыть легенду). Например: 'lineH = findobj (h, 'type', 'line')'. Если у вас несколько строк, и вы хотите только красный, вы можете использовать 'findobj' с несколькими критериями поиска, такими как' redLineH = findobj (h, 'type', 'line', 'color', 'r') ; ' – Jonas

+0

@gnovice и @Jonas - я думаю, что раньше сталкивался с findobj, но я даже не думал применить его к этой ситуации. Отличные предложения! – Doresoom

12

Вот очень простой способ:

Нажмите на объект, который вы хотите получить данные. Не будет указаний на то, что вы нажали на него.

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

Иногда бывает трудно щелкнуть по линии или другому объекту. Если у вас есть эта проблема, нажмите на осях, который содержит ребенка (детей), в котором вы заинтересованы, то:

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

Это даст вам множество ручек для различных детей. Вы можете попробовать получить их по одному, указав их на детей или использовать следующие данные, чтобы сразу получить все данные. Это будет возвращать результаты в виде массива ячеек, которая может быть немного сложнее, если вы не использовали их раньше:

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

На самом деле, вы не должны даже отобразить фигуру, чтобы получить данные, , Файлы FIG хранятся в стандартном формате Matlab MAT, который вы можете прочитать, используя встроенную функцию load(). Обработчики фигур и данные хранятся в структуре, которую вы можете легко понять и обработать.

+2

Я разместил подробную статью об этом: http://undocumentedmatlab.com/blog/fig-files-format/ –