有時候運(yùn)行的程序只保存了fig文件,而沒有保存原始數(shù)據(jù),當(dāng)需要對fig文件中的數(shù)據(jù)進(jìn)行分析和處理時就會犯難了。本文詳細(xì)介紹Matlab如何提取fig文件中的原始數(shù)據(jù),并提供原創(chuàng)的m函數(shù),可方便實現(xiàn)各類figure圖形提取數(shù)據(jù)。
1. 思路
fig文件作為Matlab中的圖形文件,其實原始數(shù)據(jù)是會存儲在figure對象中的,那么通過get函數(shù)獲取figure對象中相應(yīng)的數(shù)據(jù)屬性,就可以得到fig圖形中的數(shù)據(jù)。
例如現(xiàn)在有一個保存的fig圖形:
提取fig文件數(shù)據(jù)的方法為:
第一步 :打開圖形(.fig)文件;
第二步 :獲取曲線(line)句柄;
hl = get(ga,'Children') % 獲取坐標(biāo)軸的子對象:Line對象 ha = get(gcf,'Children'); % 獲取當(dāng)前的圖形的子對象:Axes坐標(biāo)軸對象
第三步 :獲取line對象的xdata、yadata屬性;
xdata = get(hl,'XData'); ydata = get(hl,'YData');
結(jié)果 :
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]
可以看出繪制曲線的原始數(shù)據(jù)保存在line對象中,而line對象是axes的子對象,axes是figure的子對象。獲取fig文件原始數(shù)據(jù)的思路是:先找出figure對象的所有axes子對象,再找出每個坐標(biāo)軸的所有l(wèi)ine子對象,最后獲取每條line的XData、YData、ZData屬性,得到原始數(shù)據(jù)。
2. 函數(shù)
當(dāng)figure圖形中的坐標(biāo)軸很多或線條很多,或者需要對大量figure圖形進(jìn)行批量處理時,上面的方法就很繁瑣,不便于操作。為此筆者開發(fā)了函數(shù)Fun_GetFigData.m,可以方便的提取各種類型figure圖形文件的原始數(shù)據(jù)。
function [XYZdata,Str] = Fun_GetFigData( hf,filename )
% XYZdata = Fun_GetFigData( hf ) 獲取figure圖的
% Str表頭字符串
% hf Figure圖形句柄 或 Figure文件名(必須帶擴(kuò)展名.fig)
% XYZdata 坐標(biāo)數(shù)組
% filename 保存為xls文件的名稱,不輸入或輸入0時不保存xls文件
% 輸入非零數(shù)值時,保存成xls文件,文件名與figure文件名相同
% 輸入filename時按照輸入的字符串保存成xls文件
% 注意filename不帶擴(kuò)展名.xls
% Str 為與XYZdata一一對應(yīng)的字符串cell數(shù)組,用于說明每列數(shù)據(jù)的表頭,在保存為xls文件時保存為表頭
% 文件調(diào)用規(guī)則,請打開下面例子
% open Test_Fun_GetFigData
3. 演示
**3.1 **提取單坐標(biāo)軸單曲線二維圖原始數(shù)據(jù)
t = linspace(0,10,500);
y = sin(t);
hf = figure;
plot(t,y)
XYZdata = Fun_GetFigData( hf );
結(jié)果 :返回值 XYZdata = [Xdata Ydata],第一列為X軸坐標(biāo)數(shù)據(jù),第二列為Y軸坐標(biāo)數(shù)據(jù)。
3.2 提取單坐標(biāo)軸雙曲線二維圖原始數(shù)據(jù)(橫坐標(biāo)相同)
t = linspace(0,10,500);
y1 = sin(t);
y2 = cos(t);
hf = figure;
plot(t,y1,t,y2)
XYZdata = Fun_GetFigData( hf );
結(jié)果 :返回值XYZdata = [Xdata Ydata1 Ydata2],第一列為X軸坐標(biāo)數(shù)據(jù),第二列為曲線1的Y軸坐標(biāo)數(shù)據(jù),第三列為曲線2的Y軸坐標(biāo)數(shù)據(jù)。
**3.3 **提取單坐標(biāo)軸雙曲線二維圖原始數(shù)據(jù)(橫坐標(biāo)維數(shù)相同,但數(shù)值不同)
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 );
結(jié)果 :返回值 XYZdata = [Xdata1Ydata1 Xdata2 Ydata2],第一列為曲線1的X軸坐標(biāo)數(shù)據(jù),第二列為曲線1的Y軸坐標(biāo)數(shù)據(jù),第三列為曲線2的X軸坐標(biāo)數(shù)據(jù),第四列為曲線2的Y軸坐標(biāo)數(shù)據(jù)。
3.4 提取單坐標(biāo)軸雙曲線二維圖原始數(shù)據(jù)(橫坐標(biāo)維數(shù)不同)
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 );
結(jié)果 :返回值為1×2維cell數(shù)組,XYZdata = [坐標(biāo)軸1、曲線1的數(shù)據(jù)],XYZdata = [坐標(biāo)軸1、曲線1的數(shù)據(jù)]。
XYZdata =
1×2 cell 數(shù)組
{200×2 double} {500×2 double}
**3.5 **提取單坐標(biāo)軸雙曲線二維圖原始數(shù)據(jù)(橫坐標(biāo)維數(shù)不同)
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 );
結(jié)果 :返回值為2×1維cell數(shù)組,XYZdata = [坐標(biāo)軸1的數(shù)據(jù)],XYZdata = [坐標(biāo)軸2的數(shù)據(jù)]。
XYZdata =
2×1 cell 數(shù)組
{500×3 double}
{500×2 double}
**3.6 **提取多子圖曲線二維圖原始數(shù)據(jù)
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 );
結(jié)果 :返回值為4×1維cell數(shù)組,XYZdata = [坐標(biāo)軸1的數(shù)據(jù)],XYZdata = [坐標(biāo)軸2的數(shù)據(jù)] ,XYZdata = [坐標(biāo)軸3的數(shù)據(jù)],XYZdata = [坐標(biāo)軸4的數(shù)據(jù)]。
XYZdata =
4×1 cell 數(shù)組
{500×2 double}
{500×2 double}
{500×2 double}
{500×2 double}
**3.7 **提取多子圖曲線二維圖原始數(shù)據(jù)
t = linspace(0,10,500);
y1 = sin(t);
y2 = cos(t);
hf = figure;
plotyy(t,y1,t,y2)
XYZdata = Fun_GetFigData( hf );
結(jié)果 :返回值為2×1維cell數(shù)組,XYZdata = [坐標(biāo)軸1的數(shù)據(jù)],XYZdata = [坐標(biāo)軸2的數(shù)據(jù)]。
XYZdata =
2×1 cell 數(shù)組
{500×2 double}
{500×2 double}
3.8****提取單坐標(biāo)軸曲線三維圖原始數(shù)據(jù)
t = linspace(0,10,500);
y = sin(t);
z = cos(t);
hf = figure;
plot3(t,y,z)
XYZdata = Fun_GetFigData( hf );
結(jié)果 :返回值 XYZdata = [Xdata Ydata Zdata],第一列為X軸坐標(biāo)數(shù)據(jù),第二列為Y軸坐標(biāo)數(shù)據(jù),第三列為Z軸坐標(biāo)數(shù)據(jù)。
3.9****提取單坐標(biāo)軸曲線三維曲面圖原始數(shù)據(jù)
[X,Y] = meshgrid(1:0.5:10,1:20);
Z = sin(X) + cos(Y);
hf = figure;
surf(X,Y,Z);
XYZdata = Fun_GetFigData( hf );
結(jié)果 :返回值 XYZdata = [Xdata Ydata Zdata],第一列為X軸坐標(biāo)數(shù)據(jù),第二列為Y軸坐標(biāo)數(shù)據(jù),第三列為Z軸坐標(biāo)數(shù)據(jù)。
3.10 提取原始數(shù)據(jù),并將原始數(shù)據(jù)保存為xls文件(指定文件名)
t = linspace(0,10,500);
y1 = sin(t);
y2 = cos(t);
hf = figure;
plotyy(t,y1,t,y2)
XYZdata = Fun_GetFigData( hf,'雙坐標(biāo)軸數(shù)據(jù)' ); % 指定文件名
結(jié)果 :按照指定文件名保存“雙坐標(biāo)軸數(shù)據(jù).xls”文件,每個坐標(biāo)軸單獨(dú)存成一個工作表(sheet),曲線存儲在該坐標(biāo)軸所對應(yīng)的工作表中。
**3.11 **提取原始數(shù)據(jù),并將原始數(shù)據(jù)保存為xls文件(默認(rèn)文件名)
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,'等高線圖'); % 保存當(dāng)前figure為'等高線圖.fig'
XYZdata = Fun_GetFigData( '等高線圖.fig',1 );
結(jié)果 :按照與fig文件相同的文件名保存“等高線圖.xls”文件,數(shù)據(jù)存儲在該坐標(biāo)軸所對應(yīng)的工作表中。
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 );
結(jié)果 :按照與默認(rèn)文件名保存“圖形數(shù)據(jù).xls”文件,每個坐標(biāo)軸中的每條曲線都單獨(dú)存成一個工作表(sheet),數(shù)據(jù)存儲在對應(yīng)的工作表中。
-
MATLAB仿真
+關(guān)注
關(guān)注
4文章
176瀏覽量
19903 -
圖形處理器
+關(guān)注
關(guān)注
0文章
197瀏覽量
25526 -
數(shù)據(jù)存儲器
+關(guān)注
關(guān)注
1文章
69瀏覽量
17771
發(fā)布評論請先 登錄
相關(guān)推薦
評論