0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Matlab如何提取fig文件中的原始数据?

冬至子 来源:Matlab Fans 作者:Matlab Fans 2023-07-20 17:30 次阅读

有时候运行的程序只保存了fig文件,而没有保存原始数据,当需要对fig文件中的数据进行分析和处理时就会犯难了。本文详细介绍Matlab如何提取fig文件中的原始数据,并提供原创的m函数,可方便实现各类figure图形提取数据。

1. 思路

fig文件作为Matlab中的图形文件,其实原始数据是会存储在figure对象中的,那么通过get函数获取figure对象中相应的数据属性,就可以得到fig图形中的数据。

例如现在有一个保存的fig图形:

图片

提取fig文件数据的方法为:

  • 第一步 :打开图形(.fig)文件;

  • 第二步 :获取曲线(line)句柄;

  • hl = get(ga,'Children')    % 获取坐标轴的子对象:Line对象
    ha = get(gcf,'Children');  % 获取当前的图形的子对象:Axes坐标轴对象
    
  • 第三步 :获取line对象的xdata、yadata属性;

  • xdata = get(hl,'XData');
    ydata = get(hl,'YData');
    

    结果

    hl = 
      Line - 属性:
                  Color: [0 0.4470 0.7410]
              LineStyle: '-'
              LineWidth: 0.5000
                 Marker: 'none'
             MarkerSize: 6
        MarkerFaceColor: 'none'
                  XData: [1×500 double]
                  YData: [1×500 double]
                  ZData: [1×0 double]
    

    图片

可以看出绘制曲线的原始数据保存在line对象中,而line对象是axes的子对象,axes是figure的子对象。获取fig文件原始数据的思路是:先找出figure对象的所有axes子对象,再找出每个坐标轴的所有line子对象,最后获取每条line的XData、YData、ZData属性,得到原始数据。

2. 函数

当figure图形中的坐标轴很多或线条很多,或者需要对大量figure图形进行批量处理时,上面的方法就很繁琐,不便于操作。为此笔者开发了函数Fun_GetFigData.m,可以方便的提取各种类型figure图形文件的原始数据。

function [XYZdata,Str] = Fun_GetFigData( hf,filename )
% XYZdata = Fun_GetFigData( hf ) 获取figure图的
% Str表头字符串
% hf  Figure图形句柄 或 Figure文件名(必须带扩展名.fig)
% XYZdata 坐标数组
% filename 保存为xls文件的名称,不输入或输入0时不保存xls文件
%                              输入非零数值时,保存成xls文件,文件名与figure文件名相同
%                              输入filename时按照输入的字符串保存成xls文件
%                              注意filename不带扩展名.xls
% Str 为与XYZdata一一对应的字符串cell数组,用于说明每列数据的表头,在保存为xls文件时保存为表头
% 文件调用规则,请打开下面例子
% open Test_Fun_GetFigData

3. 演示

**3.1 **提取单坐标轴单曲线二维图原始数据

t = linspace(0,10,500);
y = sin(t);
hf = figure;
plot(t,y)
XYZdata = Fun_GetFigData( hf );

图片

结果 :返回值 XYZdata = [Xdata Ydata],第一列为X轴坐标数据,第二列为Y轴坐标数据。

图片

3.2 提取单坐标轴双曲线二维图原始数据(横坐标相同)

t = linspace(0,10,500);
y1 = sin(t);
y2 = cos(t);
hf = figure;
plot(t,y1,t,y2)
XYZdata = Fun_GetFigData( hf );

图片

结果 :返回值XYZdata = [Xdata Ydata1 Ydata2],第一列为X轴坐标数据,第二列为曲线1的Y轴坐标数据,第三列为曲线2的Y轴坐标数据。

图片

**3.3 **提取单坐标轴双曲线二维图原始数据(横坐标维数相同,但数值不同)

t1 = linspace(0,10,500);
y1 = sin(t1);
t2 = linspace(-10,0,500);
y2 = cos(t2);
hf = figure;
plot(t1,y1,t2,y2)
XYZdata = Fun_GetFigData( hf );

图片

结果 :返回值 XYZdata = [Xdata1Ydata1 Xdata2 Ydata2],第一列为曲线1的X轴坐标数据,第二列为曲线1的Y轴坐标数据,第三列为曲线2的X轴坐标数据,第四列为曲线2的Y轴坐标数据。

3.4 提取单坐标轴双曲线二维图原始数据(横坐标维数不同)

t1 = linspace(0,10,500);
y1 = sin(t1);
t2 = linspace(-10,0,200);
y2 = cos(t2);
hf = figure;
plot(t1,y1,t2,y2)
XYZdata = Fun_GetFigData( hf );

结果 :返回值为1×2维cell数组,XYZdata = [坐标轴1、曲线1的数据],XYZdata = [坐标轴1、曲线1的数据]。

XYZdata =
  1×2 cell 数组
    {200×2 double}    {500×2 double}

**3.5 **提取单坐标轴双曲线二维图原始数据(横坐标维数不同)

t = linspace(0,10,500);
y1 = sin(t);
y2 = cos(t);
hf = figure;
subplot(211)
plot(t,y1)
subplot(212)
plot(t,y1,t,y1+y2)
XYZdata = Fun_GetFigData( hf );

图片

结果 :返回值为2×1维cell数组,XYZdata = [坐标轴1的数据],XYZdata = [坐标轴2的数据]。

XYZdata =
  2×1 cell 数组
    {500×3 double}
    {500×2 double}

**3.6 **提取多子图曲线二维图原始数据

t = linspace(0,10,500);
y1 = sin(t);
y2 = cos(t);
y3 = tan(t);
y4 = cot(t);
hf = figure;
subplot(221)
plot(t,y1)
subplot(222)
plot(t,y2)
subplot(223)
plot(t,y3)
subplot(224)
plot(t,y4)
XYZdata = Fun_GetFigData( hf );

图片

结果 :返回值为4×1维cell数组,XYZdata = [坐标轴1的数据],XYZdata = [坐标轴2的数据] ,XYZdata = [坐标轴3的数据],XYZdata = [坐标轴4的数据]。

XYZdata =
  4×1 cell 数组
    {500×2 double}
    {500×2 double}
    {500×2 double}
    {500×2 double}

**3.7 **提取多子图曲线二维图原始数据

t = linspace(0,10,500);
y1 = sin(t);
y2 = cos(t);
hf = figure;
plotyy(t,y1,t,y2)
XYZdata = Fun_GetFigData( hf );

图片

结果 :返回值为2×1维cell数组,XYZdata = [坐标轴1的数据],XYZdata = [坐标轴2的数据]。

XYZdata =
  2×1 cell 数组
    {500×2 double}
    {500×2 double}

3.8****提取单坐标轴曲线三维图原始数据

t = linspace(0,10,500);
y = sin(t);
z = cos(t);
hf = figure;
plot3(t,y,z)
XYZdata = Fun_GetFigData( hf );

图片

结果 :返回值 XYZdata = [Xdata Ydata Zdata],第一列为X轴坐标数据,第二列为Y轴坐标数据,第三列为Z轴坐标数据。

图片

3.9****提取单坐标轴曲线三维曲面图原始数据

[X,Y] = meshgrid(1:0.5:10,1:20);
Z = sin(X) + cos(Y);
hf = figure;
surf(X,Y,Z);
XYZdata = Fun_GetFigData( hf );

图片

结果 :返回值 XYZdata = [Xdata Ydata Zdata],第一列为X轴坐标数据,第二列为Y轴坐标数据,第三列为Z轴坐标数据。

图片

3.10 提取原始数据,并将原始数据保存为xls文件(指定文件名)

t = linspace(0,10,500);
y1 = sin(t);
y2 = cos(t);
hf = figure;
plotyy(t,y1,t,y2)
XYZdata = Fun_GetFigData( hf,'双坐标轴数据' ); % 指定文件名

结果 :按照指定文件名保存“双坐标轴数据.xls”文件,每个坐标轴单独存成一个工作表(sheet),曲线存储在该坐标轴所对应的工作表中。

图片

**3.11 **提取原始数据,并将原始数据保存为xls文件(默认文件名)

x = linspace(-2*pi,2*pi);
y = linspace(0,4*pi);
[X,Y] = meshgrid(x,y);
Z = sin(X)+cos(Y);
figure
contour(X,Y,Z);
saveas(gcf,'等高线图');   % 保存当前figure为'等高线图.fig'
XYZdata = Fun_GetFigData( '等高线图.fig',1 );

图片

结果 :按照与fig文件相同的文件名保存“等高线图.xls”文件,数据存储在该坐标轴所对应的工作表中。

图片

t1 = linspace(0,10,500);
y1 = sin(t1);
t2 = linspace(-10,0,200);
y2 = cos(t2);
hf = figure;
subplot(211)
plot(t1,y1,t2,y2)
subplot(212)
plot(t1,10*y1)
XYZdata = Fun_GetFigData( hf,1 );

结果 :按照与默认文件名保存“图形数据.xls”文件,每个坐标轴中的每条曲线都单独存成一个工作表(sheet),数据存储在对应的工作表中。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MATLAB仿真
    +关注

    关注

    4

    文章

    174

    浏览量

    19640
  • 图形处理器
    +关注

    关注

    0

    文章

    185

    浏览量

    24902
  • 数据存储器
    +关注

    关注

    1

    文章

    68

    浏览量

    17721
收藏 人收藏

    评论

    相关推荐

    如何使用Position2Go Board在MATLAB提取原始数据来绘制距离多普勒图?

    有人可以分步解释如何使用 Position2Go Board 在 MATLAB提取原始数据来绘制距离多普勒图吗?
    发表于 01-25 06:18

    无法使用MATLAB的Position2 Go雷达套件提取原始数据怎么解决?

    我无法使用 MATLAB 的 Position2 Go 雷达套件提取原始数据MATLAB 错误: 使用串行时出错(第 99 行)指定了
    发表于 01-31 06:15

    mpu6050+stm32的原始数据采集程序,通过串口发送到PC

    mpu6050+stm32的原始数据采集程序,通过串口发送到PC: printf("\r\n---------加速度X轴原始数据---------%d \r\n",GetData
    发表于 05-23 15:43

    mpu6050原始数据

    用51读取mpu6050原始数据,为什么数据都是-004,而且还不变。代码就是网上找的常见的。
    发表于 03-06 14:24

    如何通过波形原始数据获得频率

    目前在用stm32做一个小型心电仪,实现方法是通过AD转换获取心电波形的原始数据,然后进行分析,目前有一个关键的困难,那就是如何在知道这些原始数据的情况下,分析出心率,希望大家可以给一些建议和帮助,谢谢
    发表于 04-21 17:03

    数据库写入时如何覆盖原始数据

    数据库写入时如何覆盖原始数据
    发表于 10-25 11:29

    原始数据传输的BLE配置文件该怎么选择?

    嗨,大家好,这是发送/接收原始数据(数组EX:UTI8TXBuff[32);从移动到PSoC4-BLE板)的最佳方式。数据可能是一个命令。在创建项目时,我需要选择哪些配置文件?谢谢,Ashok R
    发表于 08-27 08:01

    求帮写一个筛选原始数据文件的程序,有偿!

    原始数据中进行读取文件,根据条件筛选判断出想要的数据,进行保存!(LabVIEW)联系qq:1154994116;
    发表于 03-20 11:16

    通过DMA1将原始数据写入DAC寄存器

    序列,通过DMA1将原始数据写入DAC寄存器,同时产生正弦波,AD读取频率稍大于DA频率。将AD读取寄存器数据以串口发送至matlab软件,以实现对DAC
    发表于 08-17 07:16

    如何提取sensortile.box的原始数据

    如何提取sensortile.box的原始数据
    发表于 12-30 07:09

    如何将ADC采集的原始数据的序列转换成VisualAnalogPattern Loader可以接受的I Only文件文件格式是怎样的?

    如何将ADC采集的原始数据(从-8192~+8192)的序列转换成VisualAnalogPattern Loader可以接受的I Only文件文件格式是怎样的?主要是用来评估采集
    发表于 12-15 06:22

    基于模板的SAR原始数据模拟

    合成孔径雷达(Synthetic Aperture Radar,SAR)原始数据模拟是SAR 模拟的基础,对SAR 系统研究有重要意义。时域模拟方法重现了回波数据的产生过程,数据逼真度高,被广泛使用,但
    发表于 12-19 14:14 13次下载

    基于DCT-TCQ的SAR原始数据压缩算法

    该文提出了一种基于离散余弦变换(DCT)和网格编码量化(TCQ)的SAR 原始数据压缩算法。SAR 原始数据可以看成是距离向和方位向的2 维线性调频信号的线性平移叠加,因而含有丰富的
    发表于 06-23 14:29 0次下载

    用STM32实现MPU6050原始数据的读取

    STM32+MPU6050读取加速度计和陀螺仪原始数据
    发表于 12-06 11:51 11次下载
    用STM32实现MPU6050<b class='flag-5'>原始数据</b>的读取

    基于IC MP1584EN的原始数据表布局

    电子发烧友网站提供《基于IC MP1584EN的原始数据表布局.zip》资料免费下载
    发表于 07-29 09:58 0次下载
    基于IC MP1584EN的<b class='flag-5'>原始数据</b>表布局