电子说
有时候运行的程序只保存了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. 演示
t = linspace(0,10,500);
y = sin(t);
hf = figure;
plot(t,y)
XYZdata = Fun_GetFigData( hf );
结果 :返回值 XYZdata = [Xdata Ydata],第一列为X轴坐标数据,第二列为Y轴坐标数据。
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轴坐标数据。
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 );
XYZdata =
1×2 cell 数组
{200×2 double} {500×2 double}
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 );
XYZdata =
2×1 cell 数组
{500×3 double}
{500×2 double}
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 );
XYZdata =
4×1 cell 数组
{500×2 double}
{500×2 double}
{500×2 double}
{500×2 double}
t = linspace(0,10,500);
y1 = sin(t);
y2 = cos(t);
hf = figure;
plotyy(t,y1,t,y2)
XYZdata = Fun_GetFigData( hf );
XYZdata =
2×1 cell 数组
{500×2 double}
{500×2 double}
t = linspace(0,10,500);
y = sin(t);
z = cos(t);
hf = figure;
plot3(t,y,z)
XYZdata = Fun_GetFigData( hf );
[X,Y] = meshgrid(1:0.5:10,1:20);
Z = sin(X) + cos(Y);
hf = figure;
surf(X,Y,Z);
XYZdata = Fun_GetFigData( hf );
t = linspace(0,10,500);
y1 = sin(t);
y2 = cos(t);
hf = figure;
plotyy(t,y1,t,y2)
XYZdata = Fun_GetFigData( hf,'双坐标轴数据' ); % 指定文件名
结果 :按照指定文件名保存“双坐标轴数据.xls”文件,每个坐标轴单独存成一个工作表(sheet),曲线存储在该坐标轴所对应的工作表中。
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),数据存储在对应的工作表中。
全部0条评论
快来发表一下你的评论吧 !