我怎么从MATLAB数据中提取数据?

4874(30天)
我有一些MATLAB数据,但没有与之关联的MATLAB代码。我想从图中的曲线提取数据。

接受的答案

MathWorks支万博1manbetx持团队
编辑:MathWorks支万博1manbetx持团队 2020年11月5日
这个例子展示了如何从MATLAB图中提取数据。
如果数据是存储在一个文件,比如“的例子。图”,然后打开图文件使用“openfig”。图对象分配给变量“无花果”。
无花果= openfig (“example.fig”);
如果图已经打开,然后使用“gcf”访问图对象,并将其分配给变量“无花果”。
无花果= gcf;
有几种方法可以访问的数据绘制图形对象。您可以使用孩子财产或您可以使用“findobj”。
使用儿童属性
绘制的图形对象的访问通过孩子属性。图的坐标轴对象是儿童。轴绘制图形对象通常是孩子的对象。
axObjs = fig.Children
dataObjs = axObjs.Children
dataObjs的数组,在命令窗口中显示的图形对象类型的轴。不同的图形对象存储数据是不同的。例如,线对象将数据存储在“XData”,“YData”,和“ZData”属性。如果第一个元素在“dataObjs”是一个对象,然后使用这段代码访问其数据。
x = dataObjs (1) .XData
y = dataObjs (1) .YData
z = dataObjs (1) .ZData
如果图包含其他类型的图形对象,然后使用适当的属性来访问数据。对图形对象的列表及其属性,见:
使用findobj函数
或者,你可以找到所有图形对象与一个特定的图数据属性。例如,找到所有图形对象,有一个“YData”属性。然后访问YData值的第一对象。
dataObjs = findobj(图,“属性”,“YData”)
日元= dataObjs (1) .YData
2的评论
沃尔特·罗伯森
沃尔特·罗伯森 2017年12月4日
当你画一个矩阵的列,然后处理的顺序从情节()调用返回的顺序列:
data =排序(兰德(20日5),2);
h =情节(数据);
现在h(1)对应列1,h(2)对应于第2列,等等。你可以证实这一点:
h (1)。DisplayName =“col1”;
h (2)。DisplayName =“col2”;
h (3)。DisplayName =“col3”;
h (4)。DisplayName =“col4”;
h (5)。DisplayName =“col5”;
传奇();
和看到确实项标记col5是最高平均Y(建造这样的sort()调用)。
然而,轴反向默认的儿童的顺序:
> > get (gca),“孩子”)
ans =
5×1线数组:
线(col5)
线(col4)
线(col3)
线(col2)
线(col1)
因为规则是轴的孩子们(默认情况下)画从去年第一次(首先是在上面,最后在底部)。这可以改变在几个方面,包括一些晦涩难懂的专业设置在R2014b新,但也可以改变顺序与美好uistack ()
当你回忆起一个图文件并退出轴孩子,轴的孩子会在相同的顺序出现在坐标轴时保存到数据文件中。如果没有在原来的代码修改订单,这将是最后一列第一位。所以如果你检索YData和mat2cell()成一个二维矩阵,确保fliplr()获得原始顺序。

登录置评。

更多的答案(2)

菲利普Bittencourt de Souza
菲利普Bittencourt de Souza 2017年12月15日
我在前面提到的同样的错误信息:“错误使用让转换双从细胞是不可能的。”
我和沃尔特·罗伯森的回答解决了这一问题,使用下面的代码:
打开(“example.fig”);
一个= (gca),“孩子”);
xdata =得到(,“XData”);
ydata =得到(,“YData”);
zdata =得到(,“ZData”);

实验后奥特曼
实验后奥特曼 2018年5月21日
编辑:MathWorks支万博1manbetx持团队 2021年4月19日
注意,上面的官方MathWorks回答依赖于开放和显示数字(使用open()函数)之前提取其内容。这是缓慢的和潜在的不必要的(我们总是不想显示的数字),特别是如果我们对许多图文件的循环。
相反,用户可以直接读取和分析 * .fig Matlab文件加载到内存使用load()函数,因为*。无花果files are basically simple MAT files with a .fig (rather than .mat) file extension.
幸运的是,这些文件的内部格式已经改变了多年来很少几个字段已经改变了他们的名字,但是基本的文件数据结构保持不变。本质上相同的代码可以用来提取数据从.fig文件创建了一个十年前,以及最新的Matlab版本。
注意,无花果的事实文件基本上只是垫Matlab文件是一个非法的特性,所以它总有一天会改变。但现在这是一个非常方便的功能使用。
2的评论
沃尔特·罗伯森
沃尔特·罗伯森 2022年4月22日
[文件名,filepath] = uigetfile (‘* .fig‘);
如果~ ischar(文件名)
错误(“取消”);
结束
fullname = fullfile (filepath,文件名);
无花果= openfig (fullname);
all_ax = findobj(图,“类型”,“轴”);
all_titles = cellfun (@ T (T)。字符串,得到(all_ax“标题”),“统一”,0);
all_lines = arrayfun (@ (A) findobj (,“类型”,“行”)、all_ax“统一”,0);
all_XData = cellfun (@ (L)得到(L,“XData”)、all_lines“统一”,0);
all_YData = cellfun (@ (L)得到(L,“YData”)、all_lines“统一”,0);
axIdx = 1:元素个数(all_YData)
如果iscell (all_YData {axIdx})
掩码= cellfun (@ (Y) ~ isequal (Y, [0 0]), all_YData {axIdx});
all_XData {axIdx} = all_XData {axIdx}(面具);
all_YData {axIdx} = all_YData {axIdx}(面具);
其他的
all_XData {axIdx} = {all_XData {axIdx}};
all_YData {axIdx} = {all_YData {axIdx}};
结束
结束
这个代码允许您选择一个.fig文件,和过程。它输出的单元阵列特征向量all_titles命名。它输出一个名叫all_XData单元阵列中有一个为每个轴celll数组条目,为每一行包含一个条目在轴,这是x坐标。它输出一个名叫all_YData单元阵列中有一个为每个轴celll数组条目,为每一行包含一个条目在轴,这是y坐标。协调条目被过滤删除任何行与Y坐标[0 0]
这段代码的区别和先前的版本,这个版本过滤掉y坐标的行是[0 0]。这个版本也占了一个轴的可能性只有一行。
如果坐标轴有超过一行,内部得到()调用将返回一个单元阵列的坐标,但如果坐标轴完全一行,内部得到()调用会返回数值坐标直接:这段代码检测单行的案例和故意包装内部单元阵列,以便输出是一致的。
因此,对于轴# K, all_titles {K}是一个特征向量,坐标轴标题,和all_XData {K}是一个单元阵列,每行一个条目在轴X坐标,和all_YData {K}是一个单元阵列,每行一个条目在轴Y坐标。
这段代码 不假设所有的线在一个轴具有相同数量的点。如果你愿意假定,那么你可以进一步处理数组
XData_matrices = cellfun (@cell2mat all_XData);
YData_matrices = cellfun (@cell2mat all_YData);
然后这些将细胞数组每轴,一个条目,条目将N x L数字阵列N和L的行数是分线的数量。

登录置评。

类别

找到更多的在图形对象识别帮助中心文件交换

s manbetx 845

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!