有時候運行的程序只保存了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文章
176瀏覽量
19945 -
圖形處理器
+關注
關注
0文章
198瀏覽量
25599 -
數據存儲器
+關注
關注
1文章
69瀏覽量
17793
發布評論請先 登錄
相關推薦
評論