hgsaveだけじゃない!Octaveでグラフを多様な形式で保存する alternatives

2025-05-26

hgsaveの主な機能は以下の通りです。

  • MATLAB®との互換性を考慮した保存:

    • hgsave(..., '-v6'): MATLAB® 7より前のバージョンでロードできる形式で.figファイルを保存します。
    • hgsave(..., '-v7.3'): MATLAB®バージョン7.3以降でしかロードできない形式で.figファイルを保存します。この形式はHDF5ファイルに基づき、2GBを超える.figファイルを保存するために設計されています。
  • 特定のグラフィックスオブジェクトを保存:

    • hgsave(h, filename): ハンドルhで指定されたグラフィックスオブジェクト(複数可)を、filenameに保存します。hは、保存したい図や軸、ラインなどのオブジェクトのハンドルを示す配列です。
  • 現在の図(Figure)を保存:

    • hgsave(filename): 現在アクティブな図(Figure)を、指定されたfilenameに保存します。filenameは文字列または文字ベクトルで指定します。拡張子を指定しない場合、.figが自動的に追加されます。


hgsaveに関する一般的なエラーとトラブルシューティング

    • エラーメッセージの例: error: save: permission denied for file 'figure.fig'
    • 原因: 指定されたディレクトリにファイルを書き込む権限がない場合に発生します。
    • トラブルシューティング:
      • ファイルを保存するディレクトリが書き込み可能であることを確認してください。
      • 別のディレクトリ(例: ユーザーのホームディレクトリやデスクトップ)に保存を試してください。
      • 管理者権限(Windowsでは「管理者として実行」、Linux/macOSではsudo)でOctaveを実行する必要がある場合がありますが、通常は推奨されません。
  1. ファイルパスの指定間違い (Invalid File Path)

    • エラーメッセージの例: error: invalid file name or path
    • 原因: ファイル名またはパスに無効な文字が含まれている、または存在しないパスを指定している場合に発生します。
    • トラブルシューティング:
      • ファイル名に特殊文字(\/:*?"<>|など)が含まれていないか確認してください。
      • フルパスで指定している場合、そのパスが実際に存在することを確認してください。
      • Windowsの場合、パスの区切り文字に\ではなく/を使用するか、\\のようにエスケープすることを検討してください。
  2. グラフィックスオブジェクトのハンドルが無効 (Invalid Handle)

    • エラーメッセージの例: error: hgsave: invalid handle
    • 原因: hgsave(h, filename)のようにハンドルを指定した場合、hが有効なグラフィックスオブジェクトのハンドルでない場合に発生します。例えば、閉じてしまった図のハンドルを使用している、または存在しないハンドルを指定しているなどです。
    • トラブルシューティング:
      • figure関数などを使って、実際に図が生成されていることを確認してください。
      • h = figure;のようにハンドルを変数に格納し、その変数を使用して保存するようにしてください。
      • findall(0, 'type', 'figure')などで現在開いている図のハンドルを確認できます。
  3. ファイルサイズが大きすぎる (File Too Large)

    • 原因: 非常に複雑なプロットや多数のデータ点を持つプロットを保存しようとすると、生成される.figファイルが非常に大きくなり、保存に問題が生じる場合があります。特にMATLAB® 7.3より前の形式で保存しようとする場合に発生しやすいです。
    • トラブルシューティング:
      • hgsave(..., '-v7.3')オプションを使用して、HDF5ベースの新しい形式で保存することを試してください。これにより、2GBを超えるファイルも扱えるようになります。
      • プロットの複雑さを減らすことを検討してください(例: データ点を間引く、透明度や複雑なオブジェクトの使用を控える)。
      • savefig関数を使用し、さらに'compact'オプションを試すことも有効です(MATLAB®のsavefigにも同様のオプションがあります)。これにより、MATLAB®の古いバージョンとの互換性レイヤーが削除され、ファイルサイズが劇的に小さくなることがあります。
  4. Octaveのバグまたは非互換性 (Octave Bug/Incompatibility)

    • 原因: 特定のOctaveのバージョンや、使用しているグラフィックツールキット(FLTK, Gnuplot, Qtなど)との組み合わせで、hgsaveが期待通りに動作しないバグが存在する可能性があります。特に、複雑なプロット要素(透明度、特定のフォント、カスタムUicontrolなど)を含む場合に顕著です。
    • トラブルシューティング:
      • Octaveのバージョンを最新にアップデートしてみてください。
      • graphics_toolkitを変更して保存を試してみてください(例: graphics_toolkit('gnuplot')graphics_toolkit('fltk'))。ただし、これは表示だけでなく保存される図の見た目にも影響を与える可能性があります。
      • hgsaveの代わりにsavefigを使用することを強く推奨します。 hgsaveは将来のバージョンで削除される予定であり、savefigがより堅牢な代替手段です。savefigは基本的にhgsaveと同じ引数と構文をサポートしています。
      • 問題が解決しない場合は、Octaveのバグ報告システムで同様の問題が報告されていないか確認するか、新規に報告することを検討してください。

savefigの使用を推奨する理由

  • 機能性: savefighgsaveと同等の機能を提供し、ファイルサイズを削減するための'compact'オプションなど、より新しいオプションもサポートしています。
  • 互換性: savefigはMATLAB® R2014b以降と互換性のある.figファイルを保存します。
  • 将来性: hgsaveは非推奨であり、将来のOctaveバージョンで削除される予定です。savefigを使用することで、コードの将来の互換性を確保できます。
% 現在の図を保存
plot(1:10);
savefig('my_plot.fig');

% 特定の図を保存
h = figure;
plot(rand(5));
savefig(h, 'random_plot.fig');

% よりコンパクトな形式で保存(MATLAB® R2014b以前との互換性なし)
h = figure;
plot(sin(0:0.1:10));
savefig(h, 'sine_plot_compact.fig', 'compact');


注記: Octaveではhgsaveは非推奨となり、代わりにsavefigを使用することが推奨されています。しかし、hgsaveの動作を理解するために、ここで例を挙げます。ほとんどの場合、hgsavesavefigに置き換えても同様に動作します。

例1: 現在アクティブな図を保存する

最も基本的な使用法です。hgsaveが呼び出された時点で、現在フォーカスされている(または最後に作成された)図が保存されます。

% 1. 図を作成
figure(1); % 図1を作成し、アクティブにする
plot(1:10, (1:10).^2, 'b-o');
title('二乗関数');
xlabel('x');
ylabel('y');
grid on;

% 2. 現在の図をファイルに保存
% 拡張子を省略すると、自動的に '.fig' が追加されます。
hgsave('my_first_plot');
disp('現在の図が "my_first_plot.fig" として保存されました。');

% 3. 別の図を作成し、異なる名前で保存
figure(2); % 図2を作成し、アクティブにする
x = linspace(0, 2*pi, 100);
plot(x, sin(x), 'r--');
title('サイン関数');
xlabel('角度');
ylabel('値');
grid on;

hgsave('sine_wave_plot.fig'); % 拡張子を明示的に指定することもできます
disp('現在の図が "sine_wave_plot.fig" として保存されました。');

説明:

  • hgsave('filename')は、その時点でアクティブな図をfilename.figとして保存します。
  • figure(1)figure(2)は、新しい図ウィンドウを作成し、それをアクティブにします。

例2: 特定の図(ハンドルで指定)を保存する

複数の図が開いている場合や、特定の図を明示的に保存したい場合に便利です。

% 1. 複数の図を作成し、それぞれのハンドルを取得
h1 = figure('Name', 'Figure 1 - Cosine');
plot(linspace(0, 2*pi, 100), cos(linspace(0, 2*pi, 100)), 'g-.');
title('コサイン関数');

h2 = figure('Name', 'Figure 2 - Exponential');
plot(1:10, exp(1:10), 'm:');
title('指数関数');

% 3. 図1をファイルに保存 (ハンドル h1 を指定)
hgsave(h1, 'cosine_plot_by_handle.fig');
disp('図1が "cosine_plot_by_handle.fig" として保存されました。');

% 4. 図2をファイルに保存 (ハンドル h2 を指定)
hgsave(h2, 'exponential_plot_by_handle.fig');
disp('図2が "exponential_plot_by_handle.fig" として保存されました。');

説明:

  • hgsave(h, 'filename')の形式で、特定のハンドルhを持つ図を保存します。
  • h1 = figure(...)のように、figure関数が返す値を変数に格納することで、その図のハンドルを取得できます。

例3: 特定のバージョン形式で保存する

hgsaveは、MATLAB®の特定のバージョンとの互換性を保つためのオプションを提供します。

% 図を作成
figure;
plot(rand(5));
title('ランダムデータ');

% MATLAB® 7.3以降の形式で保存 (HDF5ベース、大きなファイルに対応)
hgsave('random_data_v7_3.fig', '-v7.3');
disp('図が "random_data_v7_3.fig" (v7.3形式) として保存されました。');

% MATLAB® 7より前のバージョンでロードできる形式で保存
% hgsave('random_data_v6.fig', '-v6');
% disp('図が "random_data_v6.fig" (v6形式) として保存されました。');
% 注: '-v6'はOctaveのバージョンによってはサポートされていない場合があります。
% 現代のMATLAB®は通常v7.3形式を推奨するため、v6形式の必要性は低いです。

説明:

  • -v6: MATLAB® 7より前のバージョンと互換性のある形式で保存します。
  • -v7.3: MATLAB® R2007b以降(またはR2014b以降で推奨される)のHDF5ベースのファイル形式で保存します。これにより、2GBを超えるファイルも保存できるようになります。

例4: 複数のグラフィックスオブジェクトを保存する

これは少し特殊な使い方で、図全体ではなく、特定の軸やラインオブジェクトのみを保存するものです。ただし、.figファイルは通常、図全体をロードすることを想定しているため、この用途は限定的です。

% 図を作成し、プロット
h_fig = figure;
h_ax = axes('Parent', h_fig); % 明示的に軸を作成
h_line = plot(h_ax, 1:10, (1:10).*2, 'k-*');
title(h_ax, '特定のオブジェクトを保存する例');

% 図全体を保存
hgsave(h_fig, 'entire_figure.fig');
disp('図全体が "entire_figure.fig" として保存されました。');

% 軸オブジェクトのみを保存しようとする例 (推奨されないが、文法的には可能)
% hgsave(h_ax, 'only_axes.fig');
% disp('軸オブジェクトのみが "only_axes.fig" として保存されました。');
% 注: このファイルをMATLAB®/Octaveで開いても、期待通りの表示にならないことが多いです。
% '.fig'ファイルは通常、完全な図の階層構造を期待します。

説明:

  • hgsaveは技術的には任意のグラフィックスオブジェクトのハンドルを受け取ることができますが、.figファイルは図全体を保存し、ロードすることを意図しています。特定のサブオブジェクトのみを保存しても、.figファイルをロードした際にそのサブオブジェクトが単独で意味をなすことは稀です。
  • h_figは図のハンドル、h_axは軸のハンドル、h_lineはラインオブジェクトのハンドルです。

前述の通り、hgsaveの代わりにsavefigを使用することを強く推奨します。savefigはほぼ同じ引数と構文を使用できます。

% 1. 図を作成
figure(1);
plot(1:10, log(1:10), 'g-');
title('対数関数');
xlabel('X');
ylabel('Log(X)');
grid on;

% 2. 現在の図をファイルに保存 (savefigを使用)
savefig('my_log_plot.fig');
disp('現在の図が "my_log_plot.fig" として保存されました (savefig使用)。');

% 3. 特定の図を保存 (savefigを使用)
h_new_fig = figure('Name', '新しく作成した図');
bar(rand(1, 5));
title('棒グラフ');
savefig(h_new_fig, 'bar_chart.fig');
disp('棒グラフが "bar_chart.fig" として保存されました (savefig使用)。');

% 4. コンパクト形式で保存 (savefigの追加機能)
% この形式はMATLAB® R2014b以前との互換性を持ちませんが、ファイルサイズを削減できます。
figure;
surf(peaks(20));
title('3Dサーフェスプロット');
shading interp;
savefig('3d_surface_compact.fig', 'compact');
disp('3Dサーフェスプロットが "3d_surface_compact.fig" (compact形式) として保存されました。');


主な代替方法は以下の通りです。

  1. print関数: 最も汎用的な方法で、様々な画像フォーマット(PNG, JPEG, PDF, EPS, SVGなど)で保存できます。
  2. saveas関数: MATLAB®互換性のある関数で、print関数と似ていますが、より高レベルなインターフェースを提供します。
  3. グラフィックスツールキットの選択: Octaveのグラフィックスツールキット(FLTK, Gnuplot, Qt)を変更することで、特定の形式での出力品質や互換性が変わる場合があります。
  4. プロットデータをファイルに保存: プロット自体ではなく、プロットの元となる数値データを保存し、後で別のツールでプロットすることも可能です。

print関数

print関数は、Octaveのグラフィックスをビットマップ画像やベクター画像として保存するための非常に強力で柔軟なツールです。

一般的な使用例:

  • 特定の図のハンドルを指定して保存:

    h_fig = figure; % 図を作成し、ハンドルを取得
    plot(rand(5,5), 'o-');
    title('ランダムデータ');
    
    % ハンドル `h_fig` で指定された図をPNG形式で保存
    print(h_fig, '-dpng', 'random_data_from_handle.png');
    disp('特定の図が "random_data_from_handle.png" として保存されました。');
    
  • JPEG形式で特定の解像度で保存:

    % 図を作成
    surf(peaks(30));
    title('ピーク関数');
    
    % JPEG形式で、解像度300DPIで保存
    % `-djpeg` はJPEG形式を指定
    % `-r300` は解像度を300DPIに設定
    print -djpeg -r300 peaks_300dpi.jpg
    disp('図が "peaks_300dpi.jpg" として保存されました (300 DPI)。');
    
  • PDF形式で保存(ベクトル画像):

    % 図を作成
    x = linspace(0, 4*pi, 200);
    plot(x, cos(x).^2, 'r--');
    title('コサイン二乗関数');
    
    % PDF形式でファイルに保存
    % `-dpdf` はPDF形式を指定
    print -dpdf cosine_squared.pdf
    disp('図が "cosine_squared.pdf" として保存されました。');
    
  • PNG形式で保存:

    % 図を作成
    plot(1:10, sin(1:10));
    title('サイン波');
    xlabel('X軸');
    ylabel('Y軸');
    
    % PNG形式でファイルに保存
    % `-dpng` はPNG形式を指定
    % `my_plot.png` は出力ファイル名
    print -dpng my_plot.png
    disp('図が "my_plot.png" として保存されました。');
    

print関数の主なオプション:

  • -painters, -opengl: レンダラーを指定します。
  • -cmyk, -rgb: カラーモデルを指定します。
  • -tight: プロットの余白を最小限に抑えます。
  • -bestfit: ページサイズに合わせてプロットを調整します。
  • -r<dpi>: 出力解像度をDPI(dots per inch)で指定します(例: -r300)。ビットマップ画像に影響します。
  • -d<format>: 出力フォーマットを指定します(例: png, jpeg, pdf, eps, svg, tiffなど)。

メリット:

  • ベクトル画像形式(PDF, EPS, SVG)で保存することで、拡大しても劣化しない高品質な出力を得られる。
  • 解像度やカラーモデルなど、細かな設定が可能。
  • 非常に多くのファイル形式に対応している。

デメリット:

  • .figファイルのように、後でOctave/MATLAB®で開いて編集することはできない(画像ファイルとして保存されるため)。
  • オプションが多く、慣れるまでに時間がかかる場合がある。

saveas関数

saveas関数は、MATLAB®との互換性を目的とした関数で、print関数と似た機能を提供しますが、より直感的な引数構成です。

一般的な使用例:

% 図を作成
figure;
bar(1:5, [10 20 15 25 18]);
title('棒グラフ');

% PNG形式で保存
saveas(gcf, 'bar_chart.png', 'png'); % gcfは現在の図のハンドルを返す
disp('図が "bar_chart.png" として保存されました (saveas使用)。');

% PDF形式で保存
saveas(gcf, 'bar_chart.pdf', 'pdf');
disp('図が "bar_chart.pdf" として保存されました (saveas使用)。');

% JPEG形式で保存
saveas(gcf, 'bar_chart.jpg', 'jpg');
disp('図が "bar_chart.jpg" として保存されました (saveas使用)。');

saveas関数の構文: saveas(h, filename, format)

  • format: 出力フォーマットを指定する文字列(例: 'png', 'pdf', 'jpeg', 'eps', 'svg', 'tiff', 'fig'など)。
  • filename: 出力ファイル名。
  • h: 保存したい図のハンドル(gcfで現在の図を取得できます)。

メリット:

  • MATLAB®との互換性が高い。
  • printよりもシンプルな構文。

デメリット:

  • printほど多くのオプション(解像度など)を直接指定できない。

グラフィックスツールキットの選択

Octaveは複数のグラフィックスツールキットをサポートしており、デフォルトのツールキットや、graphics_toolkit関数で切り替えることができます。ツールキットによって、出力の品質や機能が若干異なる場合があります。

  • Qt: よりリッチなGUIを提供します。
  • Gnuplot: 外部のGnuplotプログラムを使用します。高品質な出力が可能で、多くのフォーマットをサポートします。
  • FLTK: Octaveのデフォルトで、軽量なGUIを提供します。

例えば、print関数で期待通りの結果が得られない場合に、graphics_toolkit('gnuplot')を設定してから再度printを試すと、異なる(場合によってはより良い)結果が得られることがあります。

% 現在のツールキットを確認
graphics_toolkit

% Gnuplotツールキットに切り替える(必要に応じて)
% graphics_toolkit('gnuplot');

% 図を作成し保存
plot(rand(10));
title('Gnuplotツールキットでのテスト');
print -dpdf gnuplot_test.pdf

プロットデータをファイルに保存

これはプロットの「代替」というよりは、プロットの元となるデータを保存する方法です。これにより、後で別の環境(Python, R, Excelなど)や、Octave自体でデータを読み込み、プロットを再生成できます。

  • Octave独自のバイナリ形式(.matファイル)で保存:

    % プロットしたいデータ
    x_vals = linspace(0, 10, 50);
    y_vals = exp(-0.5 * x_vals) .* cos(2 * pi * x_vals);
    
    % .matファイルに保存
    save('oscillating_data.mat', 'x_vals', 'y_vals');
    disp('プロットデータが "oscillating_data.mat" として保存されました。');
    
    % 後でデータをロードして再プロット
    % load oscillating_data.mat;
    % figure;
    % plot(x_vals, y_vals);
    
  • テキストファイル(CSVなど)に保存:

    % プロットしたいデータ
    x_data = 1:10;
    y_data = x_data.^2;
    
    % データをマトリックスに結合
    data_matrix = [x_data', y_data']; % 列ベクトルに変換して結合
    
    % CSV形式で保存 (カンマ区切り)
    csvwrite('plot_data.csv', data_matrix);
    disp('プロットデータが "plot_data.csv" として保存されました。');
    
    % 後でデータをロードして再プロット
    % loaded_data = csvread('plot_data.csv');
    % figure;
    % plot(loaded_data(:,1), loaded_data(:,2));
    

メリット:

  • 異なるプログラミング言語やソフトウェアでデータを読み込み、柔軟にプロットできる。
  • データが失われることなく、完全に再利用可能。

デメリット:

  • プロットのスタイルや設定は保存されない。
  • 直接的な画像ファイルではないため、すぐに視覚的な結果を確認できない。

これらの代替方法を理解することで、Octaveでグラフィックスを保存する際の選択肢が広がり、特定のニーズに最適な方法を選択できるようになります。通常、学術論文やレポートにはPDFやEPS、ウェブやプレゼンテーションにはPNGやJPEGがよく使われます。 Octaveでグラフィックスを保存する際にhgsaveの代替となる方法はいくつかあります。主な代替手段は以下の通りです。

  1. savefig関数 (推奨)
  2. print関数
  3. saveas関数
  4. 他の画像処理ライブラリ/ツールとの連携

それぞれについて詳しく説明します。

savefig関数 (推奨される代替手段)

hgsaveはMATLAB®との互換性のために提供されていますが、Octaveの現在のバージョンではsavefigが推奨されています。savefighgsaveとほぼ同じ構文を持ち、将来にわたってサポートされる機能です。

主な利点:

  • 'compact'オプションにより、ファイルサイズを削減できる。
  • MATLAB® R2014b以降との互換性を持つ.figファイルを生成できる。
  • Octaveにおける.figファイルの保存の標準的な方法。
  • hgsaveの機能のほとんどをカバーしている。

使用例:

% 図を作成
plot(peaks(25));
title('Peaks関数');
xlabel('X軸');
ylabel('Y軸');
zlabel('Z軸');
colorbar;

% 現在の図を.figファイルとして保存
savefig('my_peaks_plot.fig');
disp('図が "my_peaks_plot.fig" として保存されました (savefig使用)。');

% 特定の図を保存
h_fig = figure;
x = 0:0.1:2*pi;
plot(x, sin(x), 'r--', x, cos(x), 'b:');
title('サインとコサイン');
legend('sin(x)', 'cos(x)');
savefig(h_fig, 'sin_cos_plot.fig');
disp('図が "sin_cos_plot.fig" として保存されました (savefig使用)。');

% コンパクト形式で保存 (ファイルサイズ削減)
savefig('my_compact_plot.fig', 'compact');
disp('図が "my_compact_plot.fig" (コンパクト形式) として保存されました (savefig使用)。');

print関数は、Octaveでグラフィックスをさまざまな画像形式(PNG, JPEG, PDF, EPSなど)で保存するための最も汎用的な方法です。プリンターへの出力も可能です。MATLAB®のprint関数と非常に似ています。

主な利点:

  • 高品質な画像を生成できるため、出版物やプレゼンテーションに適している。
  • 解像度、サイズ、背景色などの詳細なオプションを制御できる。
  • 非常に多くの画像/ドキュメント形式に対応している。

使用例:

% 図を作成
figure(3);
plot(rand(1, 10), 'LineWidth', 2);
title('ランダムプロット');
xlabel('インデックス');
ylabel('値');
grid on;

% PNG形式で保存 (デフォルト解像度)
print('random_plot.png');
disp('図が "random_plot.png" (PNG) として保存されました。');

% 高解像度 (300 dpi) のJPEG形式で保存
print('-djpeg', '-r300', 'random_plot_high_res.jpg');
disp('図が "random_plot_high_res.jpg" (JPEG, 300dpi) として保存されました。');

% PDF形式で保存
print('-dpdf', 'random_plot.pdf');
disp('図が "random_plot.pdf" (PDF) として保存されました。');

% Encapsulated PostScript (EPS) 形式で保存 (LaTeXなどで使用)
print('-depsc', 'random_plot.eps'); % カラーEPS
% print('-deps', 'random_plot_mono.eps'); % モノクロEPS
disp('図が "random_plot.eps" (EPS) として保存されました。');

% 特定の図(ハンドルで指定)をPNG形式で保存
h_plot = figure(4);
x = 1:5;
y = [10 15 7 12 9];
bar(x, y);
title('棒グラフ');
print(h_plot, '-dpng', 'bar_chart.png');
disp('棒グラフが "bar_chart.png" (PNG) として保存されました。');

% サイズを指定してPNG形式で保存 (例: 640x480 ピクセル)
print('-dpng', '-S640,480', 'sized_plot.png');
disp('図が "sized_plot.png" (640x480 PNG) として保存されました。');

重要なprintオプション:

  • -portrait, -landscape: ページの向きを指定します。
  • -color, -mono: カラーまたはモノクロ出力を指定します。
  • -S<width>,<height>: 出力画像のピクセルサイズを指定します(例: -S800,600)。
  • -f<handle>: 保存する図のハンドルを指定します。省略すると現在の図。
  • -r<resolution>: ラスタ形式(PNG, JPEGなど)の解像度をdpiで指定します(例: -r300)。-r0はスクリーン解像度。
  • -d<device>: 出力形式を指定します(例: -dpng, -djpeg, -dpdf, -depsc)。

saveas関数もprint関数と同様に、様々なグラフィックス形式で図を保存するために使用できます。print関数よりもシンプルな構文を持ちますが、提供されるオプションは少なめです。

主な利点:

  • ファイル拡張子から自動的に形式を推測する。
  • シンプルな構文で多くの一般的な画像形式に保存できる。

使用例:

% 図を作成
figure(5);
mesh(peaks(30));
title('3Dメッシュプロット');

% ファイル名拡張子から形式を推測してPNGで保存
saveas(gcf, 'my_mesh_plot.png');
disp('図が "my_mesh_plot.png" (PNG) として保存されました (saveas使用)。');

% JPEG形式で保存
saveas(gcf, 'my_mesh_plot.jpg');
disp('図が "my_mesh_plot.jpg" (JPEG) として保存されました (saveas使用)。');

% PDF形式で保存
saveas(gcf, 'my_mesh_plot.pdf');
disp('図が "my_mesh_plot.pdf" (PDF) として保存されました (saveas使用)。');

% 形式を明示的に指定してEPSで保存
saveas(gcf, 'my_mesh_plot.eps', 'eps');
disp('図が "my_mesh_plot.eps" (EPS) として保存されました (saveas使用)。');

説明:

  • saveas(h, filename, format): 形式を明示的に指定できます(例: 'png', 'jpeg', 'pdf', 'eps')。
  • saveas(h, filename): ハンドルhで指定された図をfilenameに保存します。ファイル拡張子に基づいて形式が決定されます。

これはOctaveの組み込み関数ではありませんが、プロットを保存した後、外部ツールを使ってさらに処理する方法です。

  • ImageMagick (convertコマンド): 生成されたPNGやJPEGなどの画像を、convertコマンド(ImageMagickの一部)を使ってさらに編集したり、異なる形式に変換したりできます。Octaveのsystem()関数を使ってコマンドラインから呼び出すことができます。
  • Ghostscript: Octaveのprint関数は内部でGhostscriptを利用してPDFやPostScriptなどの形式を生成します。Ghostscriptを直接使用して、PostScriptファイルを別の形式に変換することも可能です。

使用例(system関数との組み合わせ):

% 図を作成し、PNGで保存
figure;
plot(magic(3));
title('魔法陣');
print('-dpng', 'magic_square.png');
disp('図が "magic_square.png" (PNG) として保存されました。');

% ImageMagickのconvertコマンドを使用してJPEGに変換 (背景を白に設定)
% Windowsの場合、'convert'はパスが通っている必要があります。
% Linux/macOSの場合、通常はパスが通っています。
if isunix || ismac
    system('convert magic_square.png -background white -flatten magic_square_white_bg.jpg');
    disp('PNG画像を背景白のJPEGに変換しました。');
elseif ispc
    % Windowsでは "convert" はシステムコマンドと衝突する可能性があるため、
    % "magick convert" を使用するか、フルパスを指定することが推奨されます。
    % または、"magick" を使う。
    % system('magick convert magic_square.png -background white -flatten magic_square_white_bg.jpg');
    disp('WindowsでのImageMagick変換コマンドは手動で実行してください。');
end
  • 保存後にさらなる画像処理が必要な場合は、system()関数を介して外部ツール(Ghostscript, ImageMagickなど)を連携させることもできます。
  • よりシンプルな構文で画像形式に保存したい場合はsaveasが便利です。
  • 一般的な画像形式(PNG, JPEG)やドキュメント形式(PDF, EPS)で保存したい場合は、柔軟性と詳細な制御が可能なprint関数が最も強力です。
  • .figファイルとして保存し、後でOctave/MATLAB®で編集可能な状態で開きたい場合は、savefig(または非推奨のhgsave)を使用します。