如何从MATLAB图形中提取数据?

5277次观看(过去30天)
我有一些MATLAB图,但没有与之相关的MATLAB代码。我想从图中的曲线中提取数据。

接受的答案

MathWorks支金宝app援小组
MathWorks支金宝app援小组 2020年11月11日
编辑:MathWorks支金宝app援小组 2022年3月28日
这个例子展示了如何从MATLAB图中提取数据。
如果图形存储在文件中,例如“example.”,然后使用“openfig”打开图形文件。将Figure对象分配给变量'fig'。
图= openfig(“example.fig”);
如果图形已经打开,那么使用'gcf'访问figure对象,并将其分配给变量'fig'。
FIG = gcf;
有几种方法可以访问绘制图形对象的数据。你可以使用Children属性,也可以使用'findobj'。
使用儿童财产
通过Children属性访问绘制的图形对象。坐标轴对象是图形的子对象。绘制的图形对象通常是Axes对象的子对象。
axObjs = fig.儿童
dataObjs = axObjs。孩子们
“命令窗口”中出现的“dataObjs”数组表示轴中图形对象的类型。不同的图形对象存储数据的方式不同。例如,Line对象将数据存储在'XData'、'YData'和'ZData'属性中。如果'dataObjs'中的第一个元素是一个Line对象,那么使用以下代码访问它的数据。
x = dataObjs(1)。XData
y = dataObjs(1)。YData
z = dataObjs(1)。ZData
如果图形包含其他类型的图形对象,则使用适当的属性来访问数据。有关图形对象及其属性的列表,请参见:
使用findobj Function
或者,您可以使用某个数据属性在图形中找到所有图形对象。例如,找到所有具有“YData”属性的图形对象。然后访问第一个对象的“YData”值。
dataObjs = findobj(图,“属性”“YData”
y1 = dataObjs(1)。YData
8的评论
李任
李任 2021年9月8日
清晰的所有
关闭所有
clc;
无花果= openfig (“xxxxx.fig”);
dataObjsY = findobj(图,“属性”“YData”);
y1 = dataObjsY(1).YData;
y2 = dataObjsY(2).YData;
dataObjsX = findobj(图,“属性”“XData”);
x1 = dataObjsX(1).XData;
x2 = dataObjsX(2).XData;
一个= [];
(: 1) = x1;
(:, 2) = y₁;
(:, 3) = x2;
(:, 4) = y2;
dlmwrite (“xxxxx.txt”一个,”、“);

登录评论。

更多答案(8)

Felipe Bittencourt de Souza
Felipe Bittencourt de Souza 2017年12月15日
我遇到了前面提到的相同的错误消息:“使用get Conversion从单元格进行double的错误是不可能的。”
我用Walter robertson的答案解决了这个问题,使用了以下代码:
打开(“example.fig”);
A = get(gca,“孩子”);
Xdata = get(a,“XData”);
Ydata = get(a,“YData”);
Zdata = get(a,“ZData”);
1评论
Basak可以
Basak可以 2021年5月10日
这个工作!谢谢你!

登录评论。


实验后奥特曼
实验后奥特曼 2018年5月21日
编辑:MathWorks支金宝app援小组 2021年4月19日
注意,上面的MathWorks官方答案依赖于在提取其内容之前打开和显示图形(使用open()函数)。这既缓慢又可能是不必要的(我们并不总是想要显示数字),特别是当我们循环遍历许多FIG文件时。
相反,用户可以直接读取和分析 .fig文件,通过使用load()函数将其加载到Matlab内存中,因为*. .无花果files are basically simple MAT files with a .fig (rather than .mat) file extension.
幸运的是,这些文件的内部格式在过去几年中几乎没有变化——一些字段更改了名称,但基本的文件数据结构保持不变。因此,本质上同样的代码可以用于从十年前创建的.fig文件中提取数据,以及最新的Matlab版本。
请注意,FIG文件基本上就是MAT文件这一事实是Matlab的一个未记录的特性,因此它可能有一天会改变。但就目前而言,这是一个非常方便使用的功能。
4评论
沃尔特·罗伯森
沃尔特·罗伯森 2022年4月22日1:51
[filename, filepath] = uigetfile(‘* .fig‘);
如果~ ischar(文件名)
错误(“取消”);
结束
Fullname = fullfile(filepath, filename);
FIG = openfig(fullname);
All_ax = findobj(图,“类型”“轴”);
all_title = cellfun(@(T) T. string, get(all_ax,“标题”),“统一”, 0);
all_lines = arrayfun(@(A) findobj(A,“类型”“行”)、all_ax“统一”, 0);
all_XData = cellfun(@(L) get(L,“XData”)、all_lines“统一”, 0);
all_YData = cellfun(@(L) get(L,“YData”)、all_lines“统一”, 0);
axIdx = 1:数字(all_YData)
如果iscell (all_YData {axIdx})
mask = 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的单元格数组,其中每个轴都有一个单元格数组条目,其中包含轴内每一行的条目,即直线x坐标。它输出一个名为all_YData的单元格数组,其中每个轴都有一个单元格数组条目,其中包含轴内每条线的条目,即直线y坐标。坐标条目已经过滤,以删除Y坐标[0 0]的任何行。
这段代码和之前版本的区别在于,这个版本过滤掉了y坐标为[0 0]的行。这个版本也解释了一个轴只有一条线的可能性。
在轴有多行的情况下,内部get()调用将返回一个包含坐标的单元格数组,但在轴只有一行的情况下,内部get()调用将直接返回数字坐标:这段代码检测单行情况并故意将其包装到单元格数组中,以便输出一致。
因此,对于轴#K,all_titles{K}是一个字符向量,它是轴的标题,all_XData{K}是一个单元格数组,在X坐标的轴中每行有一个条目,而all_YData{K}是在Y坐标的轴中每行有一个条目。
这段代码 并不是假设一个轴内的所有直线都有相同数量的点。如果您愿意这样假设,那么您可以进一步处理数组
XData_matrices = cellfun(@cell2mat, all_XData);
YData_matrices = cellfun(@cell2mat, all_YData);
这些是单元格数组,每个轴有一个元素,元素是nxl个数字数组,其中N是行数L是行上的点数。

登录评论。


迈克尔
迈克尔 2014年6月13日
编辑:迈克尔 2014年6月13日
我尝试遵循这些步骤,但当我得到objTypes = get(dataObjs, 'Type')时,我得到了这个错误:
使用get转换到double from cell是不可能的。
我不知道Matlab的图形格式,也不熟悉Matlab访问图形数据的API。我不确定这个错误是什么意思。
如果有人碰巧发现这一点:Matlab的数字只是”。垫”文件。scipy。Pylab中的matfile库可以使用'loadmat'命令将matfile读入numpy结构。然后可以在Python中浏览图形数据并定位数据。
编辑:也可以在Matlab中通过使用命令“s=load(' figure .fig','-mat')”加载图形来逐步遍历图形数据。使用“g金宝搏官方网站et”的解决方案对我来说从未真正起作用。我认为这是因为每个数字的结构都略有不同,人们发布的解决方案适用于特定的数字,但不能很好地推广。金宝搏官方网站如果只获取图形数据结构,则可以逐步查看并找到所需的内容。
3评论
沃尔特·罗伯森
沃尔特·罗伯森 2016年11月12日
Julia Mödl:如果你正在寻找的坐标轴是一个占位符,而不是一个坐标轴对象,你就会有这个问题。
all_axesObjs = findobj(h,“类型”“轴”);
现在只检查all_axesObjs中的项目。
或者用我之前发的,
lineObjs = findobj(dataObjs,“类型”“行”);
xdata = get(lineObjs,“XData”);
ydata = get(lineObjs,“YData”);

登录评论。


Yun-Han李
Yun-Han李 2020年3月27日
一个简单的解决方法,在精度上有点牺牲(虽然很手动):
  1. 打开一个图形,然后工具>基本拟合
2.选择“ 形状保持插值 ,然后点击 箭头 在底部单击两次以展开到整个面板。
3.然后输入感兴趣的x 评估 ,然后 保存到工作区
1评论
湿婆库马尔
湿婆库马尔 2022年3月2日
这对我很有用,谢谢。

登录评论。


帕里什。Ch
帕里什。Ch 2015年7月23日
你好,
我注意到人们在尝试运行时出现以下错误:
objsttypes = get(dataObjs,“类型”
错误使用get Conversion从单元格进行double是不可能的。
我想我有办法解决这个问题。对于曲面图,我注意到坐标轴对象(本例中为dataObjs)的子对象可能包含一个复杂单元格的子组。您必须使用cell2struct将这个单元格分解为它的基本部分,以便提取数据。下面是我的解决方案的代码:
H = gcf;
坐标轴= get(h,“孩子”);
dataObjs = get(坐标轴,“孩子”);
Props = cell2struct(dataObjs,“SurfaceProps”2);
SurfaceData = Props.SurfaceProp;
XData = SurfaceData(3,1).XData;
YData = SurfaceData(3,1).YData;
ZData = SurfaceData(2,1).ZData;
在复制粘贴这段代码之前,有几件重要的事情需要知道。
我的变量dataObjs是一个2x1单元格。单元格中的第一个索引是空的,但第二个索引是3x1 Group。我必须将这个单元格组转换为一个结构,然后可以用来访问我的数据。从这里开始,我在第二个索引上使用cell2struct来完成这个任务。cell2struct生成一个在cell2struct命令的第二个参数中命名的属性(对我来说是“SurfaceProp”)。道具。SurfaceProp从dataObjs中的3x1 Group中提取各种“子”。在我的例子中,我在Props中有三个对象。SurfaceProp:两个light对象和一个surface对象。surface对象包含x、y和z数据。 My surface object is the third index in the matrix generated by Props.SurfaceProp, so I use SurfaceData(3,1).XData to access the XData handle that is in the third index of the SurfaceData array.
我希望这能有所帮助!
2的评论
沃尔特·罗伯森
沃尔特·罗伯森 2016年11月12日
你有一些简单的代码来重现这个问题吗?我的简单测试没有创建这种类型的组,但很可能是不同的调用创建了这种组。

登录评论。


Chetanya
Chetanya 2019年11月10日
我写了一个小函数,从MATHWORKS人员回答后面的文件中提取数据。开始了, //www.tatmou.com/matlabcentral/fileexchange/73274-extract_data_from_figures?s_tid=prof_contriblnk
如果您发现任何错误,请随时提出建议。

阿布波斯货币
阿布波斯货币 2020年4月23日
编辑:阿布波斯货币 2020年4月23日
我希望这能有所帮助
X = get (gco,“XData”);
Y = get(gco,“YData”);
Z = get(gco,CData的);
2的评论
Shreeyesh Biswal
Shreeyesh Biswal 2021年7月9日
我使用zdata = get(gca, 'CData')通过稍微改变你的代码来获取我的2D热图的值,我很兴奋!非常感谢!

登录评论。


丹尼尔·阿瑞斯
丹尼尔·阿瑞斯 2017年6月19日
编辑:沃尔特·罗伯森 2020年3月27日
大家好,
我不能运行它,我得到这个错误,这段代码。
打开(“力与时间。图”);
H = gcf;%电流数字手柄
axesObjs = get(h,“孩子”);%轴处理
dataObjs = get(axesObjs,“孩子”);%句柄指向轴中的低级图形对象
lineObjs = get(dataObjs,“类型”“行”);低级图形对象的类型
xdata = get(lineObjs,“XData”);%来自低级图形对象的数据
ydata = get(dataObjs,“YData”);
zdata = get(dataObjs,“ZData”);
谢谢
1评论
1月
1月 2017年6月19日
你忘了提到你得到的错误。但请删除这条消息,并将其作为一个新问题发布,因为这是答案的部分。谢谢。
你会得到这样的答案:
lineObjs = get(dataObjs,“类型”“行”
get () 不接受3个输入。你的意思是:
lineObjs = findobj(dataObjs,“类型”“行”
?注意:即使这解决了您的问题,也请删除此消息。

登录评论。

下载188bet金宝搏

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!