質問: matlabのfigureファイル( .fig )から、グラフィックスに表示されている元となるデータ値を取得することはできますか? figureファイル( .fig )のグラフィックスに表示させた元データを失ってしまいました。保存されている.figファイルからグラフィックスの元となるデータ値を取得する方法はありますか?
回答: figure内のlineオブジェクトやsurfaceオブジェクトの'xdata'、'ydata'、'zdata'プロパティにグラフィックスの元データが格納されています。これらのプロパティ値を取得することで対応可能です。 sine波を二次元プロットした以下の .fig ファイル(sine.fig)から元データを取得する例をご紹介します。 ※今回の例は、figureオブジェクトに1つのaxes(軸)オブジェクト、軸オブジェクトに1つのラインオブジェクトがあるfigureです。subplotを使用しているなど、複数のaxesオブジェクトがあるときはデータを取得するaxesのハンドルを取得する必要があります。 まず、元となるsine.figを作成します。 %% サンプルfigureの作成 t = 0:0.01:1; y = sin(2*pi*5*t); plot(t,y); savefig('sine.fig') <> グラフィックオブジェクトのハンドル番号の取得の方法はひとつではなく、 にいくつかの方法が紹介されています。 ここでは、childrenプロパティを使用して階層構造を利用する方法をご紹介します。 *r2014b以後のバージョンでは* figureハンドルに対してchildrenメソッドを使用し、直接axesハンドルを取得可能です。 また、axesハンドルのchildren.xdataメソッドにより直接xdataを取得可能です。 hfig = open('sine.fig'); ax1 = hfig.children; x1 = ax1.children.xdata; y1 = ax1.children.ydata; 連続するメソッドを一文で指定することも可能です。すなわち、xdataの取得部分をより短く記述するには、 hfig = open('sine.fig'); x1 = hfig.children.children.xdata; y1 = hfig.children.children.ydata; とできます。ただし、プロパティの可読性とのトレードオフがあります。 *r2014a以前のバージョンでは* 以下のように、get関数を使用してプロパティを取得します。 hfig = open('sine.fig'); haxes = get(hfig,'children');%figure内のaxesのハンドル番号の取得 hline = get(haxes,'children');%lineオブジェクトの取得 x = get(hline,'xdata');%'xdata'プロパティ値の取得 y = get(hline,'ydata');%'ydata'プロパティ値の取得 plot(x,y)%再描画 以上の方法で、figureからグラフィックスの元データを取り出すことが可能です。