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

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

接受的答案

MathWorks支金宝app持团队
MathWorks支金宝app持团队 2020年11月11日
编辑:MathWorks支金宝app持团队 2020年11月11日
这个例子展示了如何从MATLAB图中提取数据。
如果图形存储在一个文件中,例如'example。,然后使用openfig打开图文件。将Figure对象赋值给变量fig。
无花果= openfig (“example.fig”);
如果图形已经打开,则使用'gcf'访问figure对象,并将其赋值给变量'fig'。
无花果= gcf;
有几种方法可以访问绘制的图形对象的数据。你可以使用Children属性,也可以使用'findobj'。
使用儿童属性
通过Children属性访问绘制的图形对象。Axes对象是图形的子对象。绘制的图形对象通常是Axes对象的子对象。
axObjs = fig.Children
dataObjs = axObjs。孩子们
命令窗口中显示的'dataObjs'数组表示轴中的图形对象的类型。不同的图形对象存储数据的方式不同。例如,Line对象将数据存储在'XData', 'YData'和'ZData'属性中。如果'dataObjs'中的第一个元素是Line对象,那么使用下面的代码访问它的数据。
x = dataObjs(1)。XData
y = dataObjs(1)。YData
z = dataObjs(1)。ZData
如果图形包含其他类型的图形对象,则使用适当的属性来访问数据。有关图形对象及其属性的列表,请参见:
使用findobj函数
或者,您可以在具有特定data属性的图形中找到所有图形对象。例如,查找所有具有“YData”属性的图形对象。然后访问第一个对象的“YData”值。
dataObjs = findobj(图,“属性”“YData”
日元= 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;
一个= [];
(: 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双从单元格是不可能的。”
我用Walter Roberson的答案解决了这个问题,使用了以下代码:
打开(“example.fig”);
一个= (gca),“孩子”);
xdata =得到(,“XData”);
ydata =得到(,“YData”);
zdata =得到(,“ZData”);
1评论
Basak可以
Basak可以 2021年5月10日
这个工作!谢谢你!

登录评论。


迈克尔
迈克尔 2014年6月13日
编辑:迈克尔 2014年6月13日
我尝试遵循这些步骤,但当我得到objTypes = get(dataObjs, 'Type')时,我得到了这个错误:
不可能从单元格使用get转换为double。
我不知道Matlab的图形格式,也不熟悉Matlab访问图形数据的API。我不确定这个错误是什么意思。
如果有人碰巧看到这个:Matlab的数字只是。垫”文件。scipy。Pylab中的io库可以使用'loadmat'命令将Matfiles读取到numpy结构中。然后可以在Python中浏览图形数据并定位数据。
编辑:你也可以在Matlab中通过步进图形数据,通过使用命令“s=load(' figure .fig','-mat')”加载图形。使用“g金宝搏官方网站et”的解决方案对我从来都不起作用。我认为这是因为每个数字的结构都略有不同,人们发布的解决方案只适用于特定的数字,但不能很好地概括。金宝搏官方网站如果您只是获取图形数据结构,那么您可以遍历它并找到您需要的内容。
3评论
沃尔特·罗伯森
沃尔特·罗伯森 2016年11月12日
Julia Mödl:如果你看到的坐标轴是一个占位符而不是一个坐标轴对象,你就会遇到这个问题。
all_axesObjs = findobj (h,“类型”“轴”);
现在只检查all_axesobs中的项目。
或者用我之前发布的
lineObjs = findobj (dataObjs,“类型”“行”);
xdata =得到(lineObjs,“XData”);
ydata =得到(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.
幸运的是,这些文件的内部格式多年来几乎没有变化——一些字段更改了它们的名称,但基本的文件数据结构保持不变。因此,从本质上讲,同样的代码可以用来从10年前创建的。fig文件以及最新的Matlab版本中提取数据。
请注意,事实上,FIG文件基本上就是MAT文件,这是Matlab的一个没有文档记录的特性,所以它可能有一天会改变。但就目前而言,这是一个非常方便使用的功能。

帕里什。Ch
帕里什。Ch 2015年7月23日
你好,
我注意到人们在尝试运行时遇到了以下错误:
objsTypes =得到(dataObjs,“类型”
错误不可能使用get Conversion从单元格double。
我想我有办法解决这个问题。对于曲面图,我注意到坐标轴对象(在本例中是dataObjs)的子对象可能包含一个复杂单元格的子组。你必须使用cell2struct将这个单元格分解成它的基本部分,这样你才能提取数据。下面是我的解决方案的代码:
h = gcf;
轴=得到(h,“孩子”);
dataObjs =得到(轴,“孩子”);
道具= cell2struct (dataObjs,“SurfaceProps”2);
SurfaceData = Props.SurfaceProp;
.XData XData = SurfaceData (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 评估 ,然后 保存到工作空间

阿布波斯货币
阿布波斯货币 2020年4月23日
编辑:阿布波斯货币 2020年4月23日
我希望这对你有所帮助
X = get (gco,“XData”);
y =得到(gco,“YData”);
z =得到(gcoCData的) ;
2的评论
Shreeyesh Biswal
Shreeyesh Biswal 2021年7月9日
我使用zdata = get(gca, 'CData')为我的2D热图的获取值稍微改变你的代码,我很激动!谢谢很多!

登录评论。


丹尼尔·阿瑞斯
丹尼尔·阿瑞斯 2017年6月19日
编辑:沃尔特·罗伯森 2020年3月27日
嗨,大家好,
我不能运行它,我得到这个错误,这个代码。
打开(“力vs Time.fig”);
h = gcf;%当前图处理
axesObjs =得到(h,“孩子”);%轴处理
dataObjs =得到(axesObjs,“孩子”);轴中的低级图形对象的%句柄
lineObjs =得到(dataObjs,“类型”“行”);低级图形对象的类型
xdata =得到(lineObjs,“XData”);%来自低级图形对象的数据
ydata =得到(dataObjs,“YData”);
zdata =得到(dataObjs,“ZData”);
谢谢
1评论
1月
1月 2017年6月19日
你忘了提到你得到的错误。但请删除这条信息,并将其作为一个新的问题发布,因为这是答案部分。谢谢。
你会得到这样的回答:
lineObjs =得到(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中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!