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

4,541意见(最近30天)
我有一些MATLAB图,但没有与之相关的MATLAB代码。我想从图中的曲线中提取数据。

接受的答案

Mathworks支万博1manbetx持团队
编辑:Mathworks支万博1manbetx持团队 11月11日11月11日
此示例演示如何从MATLAB图形中提取数据。
如果地物存储在文件中,如“example.fig”,则使用“openfig”打开地物文件。将地物对象指定给变量“fig”。
图=开放图('example.fig');
如果地物已打开,则使用“gcf”访问地物对象并将其分配给变量“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函数
或者,您可以查找图形中具有特定数据属性的所有图形对象。例如,查找具有“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;
A(:,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');
a=获得(gca,“儿童”);
扩展数据=获取(a,'xdata');
ydata=get(a,'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中浏览图形数据并定位数据。
编辑:也可以使用命令“s=load('figure.fig','-mat')加载图形,在Matlab中逐步浏览图形数据。使用“get”的解决方案我认为这是因为每个图形的结构都略有不同,人们发布的解决方案适用于某个特定的图形,但没有很好的通用性。如果你只是抓住图形数据结万博 尤文图斯构,你就可以通过它找到你需要的。
3评论
沃尔特·罗伯森
沃尔特·罗伯森 2016年11月12日
朱莉娅·莫德尔:如果你看到的轴是一个占位符而不是一个轴对象,你就会有这个问题。
all_axesObjs = findobj (h,'类型','轴');
现在只检查all_axesobjs中的项目。
或者使用我之前发布的内容,
lineObjs=findobj(dataObjs,'类型',“线路”);
扩展数据=获取(lineObjs,'xdata');
ydata=get(lineObjs,'ydata');

登录以发表评论。


亚尔奥特曼
亚尔奥特曼 2018年5月21日
编辑:Mathworks支万博1manbetx持团队 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=get(dataObjs,“类型”)
错误不可能使用从单元格到双精度的get转换。
我想我有解决这个问题。对于表面图,我注意到轴对象的子节点(在这种情况下,如此)可以包含作为复杂小区的子组。您必须使用Cell2struct将此单元格分解为其基本件,因此您可以提取数据。这是我解决方案的代码:
H = GCF;
轴=获取(h,“儿童”);
dataObjs=get(轴,“儿童”);
道具= cell2struct (dataObjs,“表面保护计划”,2);
surfacedata = props.surfaceprop;
扩展数据=表面数据(3,1)。扩展数据;
YData=表面数据(3,1)。YData;
ZData=表面数据(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日
你有一些简单的代码,可以重新创建这个问题吗?我的简单测试没有创造那种小组,但它很可能是一个不同的电话。

登录以发表评论。


李云汉
李云汉 2020年3月27日
一个简单的解决方法,在精度上有一点牺牲(虽然很手动):
  1. 打开一个图形,然后工具>基本配件.
2.选择' 保形插入剂 然后点击 在按钮处按两次以扩展到整个面板。
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,'类型',“线路”);%低级图形对象的类型
扩展数据=获取(lineObjs,'xdata');%来自低级grahics对象的数据
ydata=get(dataObjs,'ydata');
zdata =得到(dataObjs,“ZData”);
谢谢
1评论
1月
1月 2017年6月19日
你忘了提到你得到的错误。但请删除此消息并将其发布为一个新问题,因为这是答案的部分。谢谢。
您将得到如下回答:
lineobjs = get(dataobjs,'类型',“线路”)
得到() 不接受3个输入。您的意思是:
lineObjs=findobj(dataObjs,'类型',“线路”)
还是注意:即使这解决了您的问题,请删除此消息。

登录以发表评论。


chetanya.
chetanya. 2019年11月10日
我写了一个小函数,根据MATHWORKS工作人员的回答从文件中提取数据, //www.tianjin-qmedu.com/matlabcentral/fileexchange/73274-extract_data_from_figures?s_tid=prof_contriblnk
如果您发现任何bug,请随时提出建议。

s manbetx 845

社区寻宝

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

开始狩猎!