如何在MATLAB中从.fig文件中提取数据?

22
我知道这很基础,但我是MATLAB的新手。在打开.fig文件之后,如何在命令窗口中使用绘制的数据?我只看到了图表。我不确定如何获得数据。

1
好问题,但我会更改标题以使其更具体。 - yuk
@yuk:有求必应。 ;) - gnovice
4个回答

19

实际上,为了获取数据,您甚至不需要显示图像。 FIG文件存储在标准的Matlab MAT格式中,您可以使用内置的load()函数来读取。图形句柄和数据存储在一个结构中,您可以轻松理解和处理。


4
我在这篇文章中详细介绍了这个问题:http://undocumentedmatlab.com/blog/fig-files-format/ - Yair Altman
我遇到了以下错误:ASCII文件DischargeFigure.fig的第1行出现未知文本“MATLAB”。有什么线索吗? - Millemila

13

这里有一个非常简单的方法:

点击要获取数据的对象。没有任何提示表明您已经点击了它。

>> xd = get(gco,'XData');
>> yd = get(gco,'YData');
有时候点击行或其他对象本身可能会比较困难。如果你遇到这个问题,请点击包含你所感兴趣的子元素的轴,然后:

Sometimes it can be hard to click on the line, or other object, itself. If you have this problem, click on the axes that contains the child(ren) you are interested in, then:


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

这将给你一个指向不同子元素的句柄数组。你可以通过索引kids来逐个获取它们,也可以使用以下方法一次性获取所有数据。这将以cell数组形式返回结果,如果你以前没有使用过它们,可能有些棘手:

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

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

您可以通过调用以下方式来检查图形的句柄h:

get(h)

通过调用相关函数可以进一步探索坐标轴、标题和图例。

ch=get(h,'Children');
如果您正在使用我示例中的代码,则应该只有一个子项,即坐标轴。调用坐标轴的子项,您应该只有一条线。
l=get(ch,'Children');

接下来,调用线条的“Xdata”和“Ydata”字段,即可获得原始数据。

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

如果你的图形比轴线更复杂,那就有点棘手了。你需要探索每个子元素,确定它是否是你想要从中提取数据的绘图。


1
您还可以使用FINDOBJ函数来搜索具有给定参数值对集的图形对象,而无需通过父子层次结构逐步查找。如果在保存为.fig文件之前将对象的“Tag”属性设置为唯一标识符,则效果最佳。 - gnovice
4
你可以直接搜索线条句柄(但应先关闭图例)。例如:lineH = findobj(h,'type','line')。如果有多个线条,你只想要红色的那一条,可以使用findobj加上多个搜索条件,例如redLineH = findobj(h,'type','line','color','r'); - Jonas
@gnovice 和 @Jonas - 我想我之前遇到过 findobj,但我甚至没有想到将其应用于这种情况。非常好的建议! - Doresoom
在上面的例子中,我如何将多个图形包含在一个图中? - Asking Questions
@AskingQuestions 这取决于您是否想在一个图表上绘制不同的线图,或者您是否想在同一图形中使用单独的轴。对于前者,请使用“hold all”,对于后者,请使用“subplot”。MathWorks 对两者都有很好的文档说明。 - Doresoom

2
使用HGLOAD命令。参考文献在这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接