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

4497视图(过去30天)
Mathworks支金宝app持团队
评论: 李任2021年9月8日6点16分
我有一些MATLAB图形,但没有MATLAB代码与它相关。我想从图中的曲线中提取数据。

接受的答案

Mathworks支金宝app持团队
Mathworks支金宝app持团队 11月11日11月11日
编辑:Mathworks支金宝app持团队 11月11日11月11日
这个例子展示了如何从MATLAB图中提取数据。
如果图形存储在一个文件中,例如'example。,然后使用openfig打开图文件。将Figure对象赋值给变量fig。
无花果= openfig ('example.fig');
如果图形已经打开,则使用'gcf'访问figure对象,并将其赋值给变量'fig'。
无花果= gcf;
有几种方法可以访问绘制的图形对象的数据。你可以使用Children属性,也可以使用'findobj'。
使用儿童属性
通过子属性访问绘制的图形对象。轴对象是图中的儿童。绘制的图形对象通常是轴对象的子项。
axObjs=无花果儿童
dataObjs = axObjs。孩子们
命令窗口中显示的“dataobjs”数组表示轴中的图形对象的类型。不同的图形对象以不同方式存储数据。例如,行对象将数据存储在“xdata”,'ydata'和'zdata'属性中。如果“dataobjs”中的第一个元素是行对象,则使用此代码访问其数据。
x = dataobjs(1).xdata
y = dataobjs(1).ydata
z = dataObjs(1)。ZData
如果该图包含其他类型的图形对象,则使用适当的属性来访问数据。有关图形对象及其属性的列表,请参阅:
使用findobj函数
或者,您可以在具有特定data属性的图形中找到所有图形对象。例如,查找所有具有“YData”属性的图形对象。然后访问第一个对象的“YData”值。
dataObjs=findobj(图,“属性”,'ydata')
y1 = dataobjs(1).ydata
8评论
李任
李任 2021年9月8日6点16分
清晰的 全部 ;
全部 ;
clc;
无花果= openfig ( “xxxxx.fig” );
dataObjsY = findobj(图, “属性” , 'ydata' );
日元= dataObjsY (1) .YData;
y2 = dataObjsY (2) .YData;
dataObjsX = findobj(图, “属性” , “XData” );
x1 = dataObjsX (1) .XData;
x2 = dataobjsx(2).xdata;
A=[];
(: 1) = x1;
(:,2)= y1;
(:, 3) = x2;
A(:,4)=y2;
dlmwrite( “xxxxx.txt” ,一种, ”、“ );

登录评论。

更多的答案(8)

Felipe Bittencourt de Souza
Felipe Bittencourt de Souza 2017年12月15日
我有相同的错误消息之前提到:“错误使用get Conversion双从单元格是不可能的。”
我用Walter Roberson的答案解决了这个问题,使用了以下代码:
打开('example.fig');
一个= (gca),“儿童”);
xdata =得到(,“XData”);
ydata =得到(,'ydata');
zdata = get(a,“ZData”);

迈克尔
迈克尔 2014年6月13日
编辑:迈克尔 2014年6月13日
我试图遵循这些步骤,但是当我到达objtypes = get(dataobjs,'type')我收到了这个错误:
使用Get转换以从单元格转换为双击时出错是不可能的。
我不知道Matlab的图形格式,也不熟悉Matlab访问图形数据的API。我不确定这个错误意味着什么。
如果有人碰巧看到这个:Matlab的数字只是。垫”文件。scipy。Pylab中的io库可以使用'loadmat'命令将Matfiles读取到numpy结构中。然后可以在Python中浏览图形数据并定位数据。
编辑:你也可以在Matlab中通过步进图形数据,通过使用命令“s=load(' figure .fig','-mat')”加载图形。使用“g金宝搏官方网站et”的解决方案对我从来都不起作用。我认为这是因为每个数字的结构都略有不同,人们发布的解决方案只适用于特定的数字,但不能很好地概括。金宝搏官方网站如果您只是获取图形数据结构,那么您可以遍历它并找到您需要的内容。
3评论
沃尔特·罗伯森
沃尔特·罗伯森 2016年11月12日
朱莉娅·莫德尔:如果你看到的轴是一个占位符而不是一个轴对象,你就会有这个问题。
all_axesObjs = findobj (h,'类型','轴');
现在只检查all_axesobjs中的项目。
或者使用我之前发布的内容,
lineObjs = findobj (dataObjs,'类型',“行”);
xdata =得到(lineObjs,“XData”);
ydata=get(lineObjs,'ydata');

登录评论。


亚尔奥特曼
亚尔奥特曼 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版本中提取数据。
请注意,无花果基本上只是MAT文件的事实是MATLAB的未记录功能,因此可能会改变一天。但是现在它是一个非常方便的功能。

帕里什
帕里什 2015年7月23日
你好,
我注意到人们在尝试运行时遇到了以下错误:
objsTypes =得到(dataObjs,“类型”)
错误不可能使用get Conversion从单元格double。
我想我有解决这个问题。对于表面图,我注意到轴对象的子节点(在这种情况下,如此)可以包含作为复杂小区的子组。您必须使用Cell2struct将此单元格分解为其基本件,因此您可以提取数据。这是我解决方案的代码:
H = GCF;
轴=得到(h,“儿童”);
dataObjs =得到(轴,“儿童”);
道具= cell2struct (dataObjs,“SurfaceProps”,2);
surfacedata = props.surfaceprop;
扩展数据=表面数据(3,1)。扩展数据;
.YData YData = SurfaceData (3,1);
ZData = SurfaceData (2, 1) .ZData;
* *在复制粘贴此代码之前,有几件重要的事情需要知道。
我的变量dataObjs是一个2x1单元格。单元格中的第一个索引是空的,但第二个索引是3x1 Group。我必须把这个细胞组转换成一个结构,然后可以用来访问我的数据。从这里开始,我在第二个索引上使用cell2struct来完成这个任务。cell2struct生成一个属性,该属性在cell2struct命令的第二个参数中命名(我的参数是'SurfaceProp')。道具。SurfaceProp从dataObjs中的3x1组中提取各种“子对象”。在我的例子中,道具中有三个对象。SurfaceProp:两个轻物体和一个表面物体。表面对象包含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日
你有一些简单的代码,可以重新创建这个问题吗?我的简单测试没有创造那种小组,但它很可能是一个不同的电话。

登录评论。


Yun-Han李
Yun-Han李 2020年3月27日
一个简单的解决方案,稍微牺牲了一点精度(尽管相当手动):
  1. 打开一个数字,然后工具>基本配件.
2.选择“ 形状持之以恒interpolant 然后点击 在按钮处按两次以扩展到整个面板。
3.输入感兴趣的x,然后 评估 , 进而 保存到工作区 .

阿布波斯货币
阿布波斯货币 20月23日
编辑:阿布波斯货币 20月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 =得到(lineObjs,“XData”);%来自低级图形对象的数据
ydata=get(dataObjs,'ydata');
zdata =得到(dataObjs,“ZData”);
谢谢
1评论
1月
1月 2017年6月19日
你忘了提到你得到的错误。但请删除此消息并将其发布为一个新问题,因为这是答案的部分。谢谢。
您将得到如下回答:
lineobjs = get(dataobjs,'类型',“行”)
get () 不接受3个输入。你的意思是:
lineObjs = findobj (dataObjs,'类型',“行”)
还是注意:即使这解决了您的问题,请删除此消息。

登录评论。


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

下载188bet金宝搏

社区寻宝

在MATLAB Central中查找宝藏,了解社区如何帮助您!

开始狩猎!