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

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

接受的答案

MathWorks支金宝app援小组
MathWorks支金宝app援小组 2020年11月11日
编辑:MathWorks支金宝app援小组 2020年11月5日
这个例子展示了如何从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
10评论
…
2023年3月6日16:10
非常感谢,它起作用了。

登录评论。

更多答案(9)

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”);

实验后奥特曼
实验后奥特曼 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的一个未记录的特性,因此它可能有一天会改变。但就目前而言,这是一个非常方便使用的功能。
5个评论
蓍属Vortselas
蓍属Vortselas 2022年8月9日
如果只有一个标题,就会出现错误,所以我必须像这样修补它:
如果iscell (all_ax)
all_title = cellfun(@(T) T. string, get(all_ax,“标题”),“统一”, 0);
其他的
all_title = all_ax.Title.String;
结束

登录评论。


迈克尔
迈克尔 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 评估 ,然后 保存到工作区
2的评论
阿里
阿里 2023年1月16日
你好,
我的身材是这样的。有很多局部极值。我如何导出这些局部极值的坐标(excel)而不从图中逐一读取它们?

登录评论。


帕里什。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,“类型”“行”
?注意:即使这解决了您的问题,也请删除此消息。

登录评论。


一生
一生 2022年12月16日
通过MATLAB绘制函数Y=√ax+b
1评论
沃尔特·罗伯森
沃尔特·罗伯森 2022年12月16日
我不明白这个答案将如何帮助任何人从MATLAB图形提取数据??

登录评论。

类别

了解更多图形对象识别帮助中心而且文件交换

下载188bet金宝搏

社区寻宝

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

开始狩猎!

翻译的