matlab获取fig图的数据

第一步:首先需要打开要获取数据的 fig文件;
第二步:新建一个.m文件,输入下面的代码:

ha = get(gcf,'Children');  % 获取当前的图形的子对象:Axes坐标轴对象 
hl = get(gca,'Children');    % 获取坐标轴的子对象:Line对象 
xdata = get(hl,'XData');    
ydata = get(hl,'YData'); %获取 line对象的 xdata、yadata属性。

此时x和y数据就存储在工作区了,可以导出为excel或者保存为mat都可以。
也可以使用下面已经写好的函数

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文件时保存为表头


%% 

% 输入参数filename的判断
if nargin == 1
    filename = 0;
elseif ischar(hf)                       % 当输入的hf为文件名时
    filename = [hf(1:end-3)  'xls'];  
elseif isnumeric(filename)
    if filename ~= 0
            filename = '图形数据.xls';
    end
end
  
if ischar(hf)    % 判断输入hf是否为文件名
    hf = open(hf);
end

% 读取数据
ha = findall(gcf,'Type','axes');   % 获取坐标轴
for ii = 1:length(ha(:))   % 坐标轴循环
    hl = get(ha(ii),'Children');
    for jj = 1:length(hl)  % 曲线循环
        hla = hl(jj);
        x = get( hla,'XData'  );
        y = get( hla,'YData'  );
        z = get( hla,'ZData'  );
        if jj == 1
            if isempty( z )             % Z 坐标为空时
                XYZdata{ii} = [x(:)  y(:)];
                Str{ii} = ['X1';'Y1'];
            else                        % Z 坐标不为空时
                XYZdata{ii} = [x(:)  y(:)  z(:)];
                Str{ii} = ['X1';'Y1';'Z1'];
            end
        else
            if isempty( z )             % Z 坐标为空时
                if isequal(XYZdata{ii}(:,1),x(:))
                    XYZdata{ii} = [XYZdata{ii}  y(:)];
                    Str{ii} = [Str{ii} ;['Y' num2str(jj)] ];
                else
                    try  XYZdata{ii} = [XYZdata{ii}  x(:)   y(:)];
                         Str{ii} = [Str{ii} ; ['X' num2str(jj)];  ['Y' num2str(jj)] ];
                    catch
                        warning('一个坐标轴中多条曲线数据点维数不同,每条曲线生成单独生成一组数据')
                        [XYZdata,Str] = Fun_GetFigData_Cell( hf,filename );
                        return
                    end
                end
            else                        % Z 坐标不为空时
                if isequal(XYZdata{ii}(:,1),x(:))
                    XYZdata{ii} = [XYZdata{ii}  y(:)  z(:)];
                    Str{ii} = [Str{ii} ;['Y' num2str(jj)];['Z' num2str(jj)] ];
                else
                    try  XYZdata{ii} = [XYZdata{ii}  x(:)   y(:)  z(:)];
                         Str{ii} = [Str{ii} ;['X' num2str(jj)];['Y' num2str(jj)];['Z' num2str(jj)] ];
                    catch
                        warning('一个坐标轴中多条曲线数据点维数不同,每条曲线生成单独生成一组数据')
                        [XYZdata,Str] = Fun_GetFigData_Cell( hf,filename );
                        return
                    end
                end
            end
        end
    end
end

% 数据整理
if length(XYZdata) == 1   % 只有一个坐标轴时
    XYZdata = cell2mat(XYZdata);
end

[m,~] = size(XYZdata);
if m == 1     % XYZdata为行向量时
    XYZdata = XYZdata(:);  % 转换为列向量
    Str = Str(:);  % 转换为列向量
end

% 存储为xls文件
if filename ~= 0
    Fun_SaveXLS(XYZdata,filename,Str);
end

end


function [XYZdata,Str] = Fun_GetFigData_Cell( hf,filename )
% 每个坐标轴保存成cell数组的行数,每条曲线保存成cell数组的列数
% XYZdata数据类型为cell,维度为 坐标轴数量×坐标轴中的最大曲线数量

% 读取数据
ha = findall(gcf,'Type','axes');   % 获取坐标轴
for ii = 1:length(ha(:))   % 坐标轴循环
    hl = get(ha(ii),'Children');
    for jj = 1:length(hl)  % 曲线循环
        hla = hl(jj);
        x = get( hla,'XData'  );
        y = get( hla,'YData'  );
        z = get( hla,'ZData'  );
        if isempty( z )             % Z 坐标为空时
            XYZdata{ii,jj} = [x(:)  y(:)];
            Str{ii,jj} = [ ['X' num2str(jj)]; ['Y' num2str(jj)] ];
        else                        % Z 坐标不为空时
            XYZdata{ii,jj} = [x(:)  y(:)  z(:)];
            Str{ii,jj} = [ ['X' num2str(jj)] ;['Y' num2str(jj)] ;['Z' num2str(jj)] ];
        end
    end
end

if filename ~= 0
    Fun_SaveXLS(XYZdata,filename,Str);
end

end

function Fun_SaveXLS(XYZdata,filename,Str)
% 将读取的数据保存为xls数据文件,每一个元素保存为一个Sheet
% Str为表头

if iscell(XYZdata)
    [m,n] = size(XYZdata);
    for ii = 1:m
        for jj = 1:n
            if n == 1
                sheet = ['坐标轴' num2str(ii)];
            else
                sheet = ['坐标轴' num2str(ii) ' 曲线' num2str(jj)];
            end
            warning off
            str = Str{ii,jj};
            for kk = 1:length( Str{ii,jj} )
                xlswrite(filename,{str(kk,:)},sheet,[char('A'+kk-1) '1']);   % 写入字符串到单元格时必须使用cell字符串数组格式
            end
            if ~isempty(XYZdata{ii,jj})   % 数据不为空时
                   xlswrite(filename,XYZdata{ii,jj},sheet,'A2');
            end
            warning on
        end
    end
else
    sheet = '坐标轴1';
    warning off
    for kk = 1:length( Str{1} )
        str = Str{1};
        xlswrite(filename,{str(kk,:)},sheet,[char('A'+kk-1) '1']);
    end
    xlswrite(filename,XYZdata,sheet,'A2');
    warning on
end

end

posted @ 2023-05-14 15:51  Ada_CN  阅读(729)  评论(0编辑  收藏  举报