openfigだけじゃない!OctaveでMATLABの図を扱う代替プログラミング手法

2025-05-26

openfigは、MATLABで作成された.figファイルをOctaveで開くための関数です。

.figファイルは、MATLABで生成されたグラフやGUI(グラフィカルユーザーインターフェース)のレイアウト情報が保存されているバイナリファイルです。MATLAB環境がないと直接開いて編集することはできません。

OctaveはMATLABと高い互換性を持つオープンソースの数値計算ソフトウェアですが、MATLABのすべての機能を完全に再現しているわけではありません。特に、GUIやグラフィックスに関しては、MATLABとOctaveの間で若干の差異があることがあります。

openfig関数を使うことで、Octaveでこれらの.figファイルを読み込み、表示することができます。これにより、MATLABで作成された図をOctaveで確認したり、簡単な編集を試みたりすることが可能になります。

ただし、注意点としては以下の点が挙げられます。

  • 用途: 主に、MATLABで作成された図の内容を確認したり、基本的な表示を行ったりするのに役立ちます。本格的な編集や開発は、やはりMATLAB環境で行うのが推奨されます。
  • 編集の制限: openfigで開いた図に対して、MATLABと同等の柔軟な編集ができるとは限りません。特にGUIの場合は、レイアウトが崩れたり、イベントコールバックが動作しなかったりすることがあります。
  • 完全な互換性ではない: MATLABで作成された複雑なGUIや、特定のMATLABツールボックスに依存する図の場合、Octaveのopenfigでは完全に再現されない、または一部の機能が動作しない可能性があります。


.figファイルが開けない/見つからないエラー

  • トラブルシューティング
    1. ファイルパスの確認
      your_figure.figというファイルが、実際に指定したパス(またはカレントディレクトリ)に存在することを確認してください。フルパスで指定してみるのも有効です。
    2. ファイル名のスペルミス
      ファイル名に誤字脱字がないか確認してください。
    3. カレントディレクトリの確認
      Octaveのコマンドウィンドウでpwdと入力し、現在の作業ディレクトリを確認してください。ファイルが別の場所にある場合は、cdコマンドで移動するか、フルパスで指定してください。
    4. ファイルが破損していないか
      元のMATLAB環境でその.figファイルが問題なく開けるか確認してください。
    5. ファイルの形式
      openfigはMATLABの.figファイルを開くためのものです。他のソフトウェアで作成された図ファイルや、Octave独自の図形式(もしあれば)は開けない可能性があります。
  • 原因
    • 指定したファイル名が間違っている。
    • ファイルがカレントディレクトリまたはOctaveの検索パス上にない。
    • ファイルが破損しているか、.figファイルとして正しく保存されていない。
    • そもそもMATLABで作成された.figファイルではない(例: Octave独自の図形式など)。
  • エラーメッセージの例
    • error: openfig: file 'your_figure.fig' not found
    • error: figure data in 'your_figure.fig' is not valid

図が正しく表示されない/レイアウトが崩れる

  • トラブルシューティング
    1. Octaveのグラフィックスツールキットの変更
      Octaveは複数のグラフィックスツールキットをサポートしています。デフォルトは通常qtまたはfltkですが、graphics_toolkit("gnuplot")graphics_toolkit("qt")などを試して、表示が改善されるか確認してください。
      graphics_toolkit("gnuplot"); % または "qt", "fltk"
      openfig('your_figure.fig');
      
    2. シンプルな図で試す
      まずは、MATLABで簡単なplotコマンドなどで作成したシンプルな.figファイルでopenfigが正常に動作するか確認してください。これにより、openfig関数自体に問題があるのか、特定の複雑な図に問題があるのかを切り分けられます。
    3. MATLABのバージョンと互換性
      新しいMATLABバージョンで作成された.figファイルは、古いOctaveバージョンでは完全にサポートされないことがあります。可能な限りOctaveを最新バージョンに更新することを検討してください。また、MATLABでsavefig('filename.fig', 'compact')のように'compact'オプションを使って保存すると、古いMATLABバージョンとの互換性が高まる場合がありますが、Octaveでの効果は保証されません。
    4. データのエクスポートと再プロット
      最も確実な方法は、MATLABで図の元となるデータを.matファイルとして保存し、Octaveでその.matファイルを読み込んで、Octaveのプロット関数で図を再作成することです。これにより、グラフィックスエンジンの違いによる問題を回避できます。
      • MATLAB側:
        x = 1:10;
        y = sin(x);
        plot(x, y);
        save('data_for_octave.mat', 'x', 'y');
        
      • Octave側:
        load('data_for_octave.mat');
        plot(x, y);
        
    5. GUIの制限
      OctaveのGUIサポートはMATLABに比べて限定的です。複雑なGUIアプリケーションを.figファイル経由で完全に再現することは難しい場合があります。GUIの機能を期待する場合は、OctaveのGUIツールキット(もしあれば)を使用して、OctaveでGUIを構築し直すことを検討する方が良いでしょう。
  • 原因
    • MATLABとOctaveのグラフィックスエンジンの違い(特にGUI)。
    • .figファイルがMATLABの特定のツールボックスや高度なグラフィックス機能に依存している。
    • Octaveのグラフィックスツールキット(Gnuplot, Qt, FLTKなど)の設定による違い。
    • 古いMATLABバージョンで作成された.figファイルとの互換性の問題。
  • 症状
    • 図の一部が表示されない、欠けている。
    • 軸のラベルやタイトルが重なっている、読みにくい。
    • 色やフォントが意図したものと異なる。
    • GUI(グラフィカルユーザーインターフェース)の場合、ボタンやパネルの配置がずれる、機能しない。

openfig関数が見つからない/未定義エラー

  • トラブルシューティング
    1. Octaveのバージョン確認
      使用しているOctaveのバージョンがopenfigをサポートしているか確認してください。古いバージョンでは存在しない可能性があります。最新版のOctaveでは通常含まれています。
    2. パッケージの確認
      もしopenfigが標準で含まれていない場合、特定のパッケージとして提供されている可能性があります。pkg listでインストールされているパッケージを確認し、必要であればpkg install <package_name>でインストールしてください。
  • 原因
    • Octaveのバージョンが古いか、openfig関数が含まれていない。
    • パスが正しく設定されていない。
  • エラーメッセージの例
    • error: 'openfig' undefined near line 1 column 1

メモリ不足エラー

  • トラブルシューティング
    1. 不要なアプリケーションを閉じる
      他のメモリを消費するアプリケーションを閉じて、Octaveに利用可能なメモリを増やします。
    2. システムのメモリを増設する
      根本的な解決策として、物理メモリを増やすことを検討します。
    3. より小さなファイルで試す
      非常に大きな.figファイルではなく、もう少しサイズの小さいファイルで動作するか確認します。
    4. データの再プロット
      上記の「データのエクスポートと再プロット」の方法を検討してください。大きな図を.figファイルとして転送するよりも、元データとそのプロットスクリプトを共有する方が効率的です。
  • 原因
    • .figファイルが非常に大きく、多くのグラフィックスオブジェクトを含んでいるため、Octaveがメモリを使い果たす。
  • 症状
    • 大きな.figファイルを開こうとすると、Octaveがクラッシュしたり、応答しなくなったりする。
    • out of memoryのようなエラーメッセージが表示される。


  1. 既存の.figファイルを開いて表示する。
  2. 開いた図のハンドルを取得し、そのプロパティを調べたり、変更したりする。

前提条件

  • 以下の例では、my_figure.figという名前の.figファイルがカレントディレクトリにあると仮定します。
  • MATLABで作成された有効な.figファイルが必要です。

例1: 基本的な.figファイルのオープンと表示

最も基本的な使用例です。

% 例1: 基本的な.figファイルのオープンと表示

% 1. .figファイルが保存されていることを確認
%    この例では、カレントディレクトリに 'my_figure.fig' が存在すると仮定します。
%    もし存在しない場合は、MATLABで適当な図を作成して保存してください。
%    例: MATLABで
%        x = 0:0.1:2*pi;
%        y = sin(x);
%        plot(x, y, 'r-o');
%        title('Sine Wave');
%        xlabel('X-axis');
%        ylabel('Y-axis');
%        grid on;
%        savefig('my_figure.fig');
%    として保存したものを利用してください。

% 2. openfig関数で.figファイルを開く
fprintf('Opening my_figure.fig...\n');
h_fig = openfig('my_figure.fig');

% 3. 図が表示されるのを待つ (通常、openfigを呼び出すと自動的に表示されます)
%    figure(h_fig) とすることで、その図をアクティブにすることも可能です。
%    (openfigは通常、開いた図をアクティブにします)

fprintf('Figure opened. Handle: %d\n', h_fig);

% 少し待ってから閉じる (オプション)
% pause(3);
% close(h_fig);
% fprintf('Figure closed.\n');

解説

  • h_fig:開かれた図(Figureオブジェクト)のハンドルです。このハンドルを使って、後述するように図のプロパティを操作できます。
  • openfig('my_figure.fig'):指定されたパス(またはカレントディレクトリ)にあるmy_figure.figファイルを開き、その図のハンドルを返します。

例2: 開いた図のプロパティの取得と変更

openfigで開いた図のハンドルを使って、そのプロパティを変更する例です。

% 例2: 開いた図のプロパティの取得と変更

% 1. .figファイルを開く
fprintf('Opening my_figure.fig for property manipulation...\n');
h_fig = openfig('my_figure.fig');

% 2. 図のハンドルが有効であることを確認
if ishandle(h_fig)
    fprintf('Figure handle: %d\n', h_fig);

    % 図のタイトルを変更する
    fprintf('Changing figure title...\n');
    set(h_fig, 'Name', 'Modified Figure from Octave');
    set(h_fig, 'NumberTitle', 'off'); % 数字タイトルを非表示にする

    % 図の背景色をグレーに変更する
    fprintf('Changing figure background color...\n');
    set(h_fig, 'Color', [0.8 0.8 0.8]); % RGB値でグレーを指定

    % 軸のハンドルを取得する
    % openfigで開かれた図のすべての子オブジェクトを検索し、その中のaxesオブジェクトを取得します。
    % MATLAB/Octaveの図の構造: Figure -> Axes -> Line/Text/etc.
    h_axes = findobj(h_fig, 'Type', 'axes');

    if ~isempty(h_axes)
        fprintf('Axes handle found: %d\n', h_axes(1)); % 最初の軸のハンドルを使用

        % 軸のタイトルを変更する
        fprintf('Changing axes title...\n');
        set(get(h_axes(1), 'Title'), 'String', 'Modified Sine Wave');

        % X軸とY軸のラベルの色を変更する
        fprintf('Changing axis label colors...\n');
        set(get(h_axes(1), 'XLabel'), 'Color', 'blue');
        set(get(h_axes(1), 'YLabel'), 'Color', 'green');

        % グリッドの色を薄いグレーに変更する
        fprintf('Changing grid color...\n');
        set(h_axes(1), 'XGrid', 'on', 'YGrid', 'on'); % グリッドがoffの場合にonにする
        set(h_axes(1), 'GridColor', [0.5 0.5 0.5]);
    else
        fprintf('No axes found in the figure.\n');
    end

else
    fprintf('Failed to open figure or invalid handle.\n');
end

% 少し待ってから閉じる (オプション)
% pause(5);
% close(h_fig);

解説

  • set(h_axes(1), 'GridColor', [R G B]):グリッドの色を変更します。
  • set(h_axes(1), 'XGrid', 'on', 'YGrid', 'on'):X軸とY軸のグリッドをオンにします。
  • set(get(h_axes(1), 'XLabel'), 'Color', 'blue'):X軸ラベルのオブジェクトのハンドルを取得し、その色を変更します。Y軸ラベルも同様です。
  • set(get(h_axes(1), 'Title'), 'String', '...'):軸のタイトルテキストを変更します。
  • get(h_axes(1), 'Title'):最初の軸(h_axes(1))のタイトルオブジェクトのハンドルを取得します。
  • findobj(h_fig, 'Type', 'axes')h_figで指定された図の子オブジェクトの中から、タイプが'axes'(軸)であるものをすべて検索し、そのハンドルを返します。通常、図には1つまたは複数の軸があります。
  • set(h_fig, 'Color', [R G B]):図の背景色を変更します。RGB値(0から1の範囲)で指定します。
  • set(h_fig, 'NumberTitle', 'off'):図のウィンドウタイトルから図の番号(Figure 1, Figure 2など)を削除します。
  • set(h_fig, 'Name', '...'):図のウィンドウタイトルを変更します。

例3: 存在しないファイルを扱おうとした場合

エラーハンドリングの例です。

% 例3: 存在しないファイルを扱おうとした場合

fprintf('Attempting to open a non-existent file...\n');
try
    % 存在しないファイル名を指定
    h_fig_nonexistent = openfig('non_existent_figure.fig');
    fprintf('Unexpectedly opened: %d\n', h_fig_nonexistent);
    close(h_fig_nonexistent);
catch
    fprintf('Caught an error as expected: File not found or invalid.\n');
    % Octaveは通常、ファイルが見つからない場合に直接エラーをスローします。
    % MATLABでは警告を出しつつハンドルを返す場合もありますが、Octaveではエラーで停止することが多いです。
end

fprintf('\nAttempting to open a directory as a figure...\n');
try
    % ディレクトリをファイルとして開こうとする
    % 例えば、Octaveのヘルプディレクトリを試す
    h_fig_dir = openfig(fullfile(octave_config_info.prefix, 'share', 'octave', '5.2.0', 'examples'));
    fprintf('Unexpectedly opened: %d\n', h_fig_dir);
    close(h_fig_dir);
catch
    fprintf('Caught an error as expected: Cannot open directory as figure.\n');
end
  • openfigがファイルを読み込めない場合、Octaveは通常エラーをスローします。catchブロックでそのエラーを捕捉し、適切なメッセージを表示できます。
  • try ... catch ... endブロックは、エラーが発生する可能性のあるコードを囲みます。
  • GUIの操作
    openfigで開いたGUIの場合、ボタンクリックなどのイベントコールバックは通常動作しません。これはopenfigがGUIのレイアウトを読み込むだけで、その背後にあるMATLABコードを実行するわけではないためです。GUIをインタラクティブにしたい場合は、OctaveでGUIを再構築する必要があります。
  • グラフィックスツールキット
    Octaveのグラフィックスツールキット(Gnuplot, Qt, FLTKなど)の設定によって、表示結果がわずかに異なる場合があります。必要に応じてgraphics_toolkit()コマンドで切り替えてみてください。
  • MATLABとの互換性
    これらの例はOctaveで動作しますが、MATLABの.figファイルの複雑さによっては、openfigで完全に再現できない場合があります。特にMATLABの特定のツールボックスに依存するグラフや複雑なGUIは、Octaveでの表示や操作に限界があります。


データのエクスポートとOctaveでの再プロット(最も推奨される方法)

これは最も確実で柔軟な方法です。MATLABで図を作成する際に、図の元となるデータを保存し、Octaveでそのデータを読み込んで、Octaveのプロット関数(plot, surf, imagescなど)で図を再作成します。

メリット

  • 将来的に異なるソフトウェアに移行する際にもデータの再利用が容易。
  • Octaveで図を完全に制御・カスタマイズできる。
  • MATLABとOctave間のグラフィックスエンジンの違いによる表示の問題を回避できる。

デメリット

  • MATLABのGUIアプリケーションの一部として作成された図の場合、GUIのロジック自体は再実装が必要になる。
  • 元のMATLABの図が複雑な場合、再プロットのためのOctaveコードを書く手間がかかる。

プログラミング例

ステップ1: MATLAB側でデータを保存する

MATLABで図を作成したスクリプトに、データを.matファイル(MATLABのバイナリデータファイル)やテキストファイルとして保存するコードを追加します。

% MATLABでのコード例 (save_data_for_octave.m)
% データを定義
x = 0:0.1:2*pi;
y1 = sin(x);
y2 = cos(x);

% 図の作成(例として)
figure;
plot(x, y1, 'b-', x, y2, 'r--');
title('Sine and Cosine Waves');
xlabel('X-axis');
ylabel('Y-axis');
legend('Sine', 'Cosine');
grid on;

% データを.matファイルとして保存
% OctaveもMATLABの.matファイルを読み込めます
save('plot_data.mat', 'x', 'y1', 'y2');

% (オプション) データをCSVやテキストファイルとして保存することも可能
% dlmwrite('plot_data_y1.csv', y1); % 単一の配列
% dlmwrite('plot_data_xy.csv', [x' y1' y2'], ','); % 複数の配列を結合して保存

ステップ2: Octave側でデータを読み込み、再プロットする

Octaveで、保存されたデータを読み込み、plotなどの関数を使って図を再作成します。

% Octaveでのコード例 (replot_in_octave.m)

% .matファイルを読み込む
% 'x', 'y1', 'y2' という変数がワークスペースにロードされます
fprintf('Loading plot_data.mat...\n');
load('plot_data.mat');

% データをOctaveで再プロットする
fprintf('Replotting data in Octave...\n');
figure; % 新しい図ウィンドウを作成
plot(x, y1, 'b-', 'linewidth', 1.5, x, y2, 'r--', 'linewidth', 1.5);

% 図のプロパティを設定する (Octave流)
title('Sine and Cosine Waves (Re-plotted in Octave)');
xlabel('X-axis');
ylabel('Y-axis');
legend('Sine', 'Cosine', 'Location', 'southwest');
grid on;

fprintf('Plotting complete.\n');

% (もしCSVで保存した場合の読み込み例)
% y1_csv = dlmread('plot_data_y1.csv');
% xy_csv = dlmread('plot_data_xy.csv', ',');
% x_csv = xy_csv(:,1);
% y1_csv = xy_csv(:,2);
% y2_csv = xy_csv(:,3);
% figure;
% plot(x_csv, y1_csv); % など

図のエクスポートとOctaveでの画像表示

MATLABで図を画像ファイル(PNG, JPEG, PDFなど)として保存し、Octaveの環境ではその画像ファイルを表示するだけにとどめる方法です。インタラクティブな操作やプロパティの変更はできません。

メリット

  • MATLABの図の見た目を正確に再現できる。
  • 最も簡単で手間がかからない。

デメリット

  • プロットのデータにアクセスしたり、プロパティをプログラム的に変更したりできない。
  • 図のインタラクティブな操作(ズーム、パンなど)ができない。

プログラミング例

ステップ1: MATLAB側で図を画像として保存する

% MATLABでのコード例 (save_figure_as_image.m)
x = 0:0.1:2*pi;
y = sin(x);
plot(x, y);
title('My Figure for Image Export');
xlabel('X');
ylabel('Y');

% 図をPNGファイルとして保存
% '-dpng' はPNG形式を指定
% '-r300' は300dpiの解像度を指定 (高画質にしたい場合)
print('my_figure_image.png', '-dpng', '-r300');

% または saveas 関数
% saveas(gcf, 'my_figure_image_saveas.png', 'png');

ステップ2: Octave側で画像を表示する

Octaveには直接画像をViewerで開くような組み込み関数はありませんが、外部コマンドを呼び出すことで可能です。

% Octaveでのコード例 (display_image_in_octave.m)

% 画像ファイルが存在することを確認
image_file = 'my_figure_image.png';

if exist(image_file, 'file')
    fprintf('Displaying image: %s\n', image_file);
    % システムコマンドを使って画像ビューアを起動する
    % OSによってコマンドが異なります
    if ismac() % macOS
        system(['open ' image_file]);
    elseif isunix() % Linux (e.g., 'eog' for Eye of GNOME, 'xdg-open' for general)
        system(['xdg-open ' image_file]);
    elseif ispc() % Windows
        system(['start ' image_file]);
    else
        fprintf('Unsupported OS for direct image display. Please open %s manually.\n', image_file);
    end
else
    fprintf('Error: Image file %s not found.\n', image_file);
end

非公式の.figパーサー/コンバーターの利用 (限定的)

一部の非公式なスクリプトやツールが存在し、MATLABの.figファイルからプロットデータを抽出しようと試みるものもあります。しかし、これらはMATLABのバージョンアップによって動作しなくなったり、全てのオブジェクトタイプに対応していなかったりする可能性が高いです。

メリット

  • 元のMATLABスクリプトが手元になく、.figファイルしかない場合に、データ復旧の可能性をわずかに提供する。

デメリット

  • 公式にサポートされていないため、問題が発生しても解決が難しい。
  • 通常、複雑な図やGUIには対応できない。
  • MATLABのバージョンに依存する。
  • 信頼性が低い。

プログラミング例 (非推奨)

特定のツールやスクリプトに依存するため、ここでは具体的なコード例は示しません。もしこのようなアプローチを検討する場合は、GitHubなどで「octave openfig fig parser」のようなキーワードで検索し、利用可能なツールがあるか確認する必要があります。ただし、その使用は自己責任であり、期待通りの結果が得られないことが多いことを理解しておくべきです。