【Octave】savefigでグラフを画像保存!エラー解決と高品質出力テクニック

2025-05-26

savefigを使うことで、作成した図(Figure)を、PNG、JPEG、PDF、EPSなどの様々なフォーマットで保存できます。これにより、レポートやプレゼンテーションに図を埋め込んだり、他の人と共有したりすることが容易になります。

基本的な使い方

最も基本的な使い方は、保存したいファイル名を引数として指定することです。

plot(x, y); % グラフを作成
savefig('myplot.png'); % 現在の図を 'myplot.png' という名前で保存

引数について

  • フォーマット (format, オプション)
    ファイル名に拡張子を含めずに、明示的に出力フォーマットを指定することもできます。これは、print関数でより詳細に制御できるオプションの一部です。

    plot(x, y);
    savefig('myplot', 'png'); % 'myplot.png' として保存
    
  • 図のハンドル (figure handle, オプション)
    複数の図を開いている場合、どの図を保存するかを数値のハンドルで指定できます。指定しない場合、現在の図(現在アクティブな図)が保存されます。

    h = figure; % 新しい図を作成し、ハンドルを取得
    plot(1:10, rand(1,10));
    savefig(h, 'myfigure_specific.pdf'); % 特定の図をPDFで保存
    
  • ファイル名 (filename)
    保存するファイルのパスと名前を指定します。拡張子(例: .png, .jpg, .pdf)によって保存されるファイル形式が決まります。拡張子を指定しない場合、Octaveはデフォルトのフォーマットで保存しようとします(Octaveのバージョンや設定によって異なる場合がありますが、通常は独自の.figフォーマットではないことに注意してください。MATLABの.figファイルとは互換性がありません)。

savefigとprintの違い

Octaveにはprintという類似の関数もあります。

  • printはより低レベルで、dpi(解像度)の指定、背景色の設定、PostScriptドライバーの選択など、より詳細な出力設定を制御する際に使用されます。多くの高度なオプションが必要な場合はprint関数を使うのが一般的です。
  • savefigはMATLABのsaveasに似ており、比較的シンプルに図をファイルに保存するのに使われます。


% 1. シンプルなプロットを作成
x = -pi:0.1:pi;
y = sin(x);
plot(x, y);
title('サイン波');
xlabel('x');
ylabel('sin(x)');

% 2. PNG形式で保存
savefig('sine_wave.png');

% 3. PDF形式で保存(現在の図を新しいファイル名で)
savefig('sine_wave_document.pdf');

% 4. 別の図を作成し、それを特定のフォーマットで保存
figure(2);
plot(x, cos(x), 'r--');
title('コサイン波');
xlabel('x');
ylabel('cos(x)');
savefig(2, 'cosine_wave.jpeg'); % 図2をJPEGで保存


図が表示されない、または空の図が保存される

原因

  • 複数の図がある場合に、保存したい図のハンドルを正しく指定していない。
  • グラフが作成されているが、表示される前にsavefigが実行された(特にスクリプトで実行する場合)。
  • plotなどの描画コマンドを実行する前にsavefigを呼び出した。

トラブルシューティング

  • 図が閉じられていないか確認します。closeコマンドをsavefigの前に実行すると、図が保存されません。
  • 特定の図を保存する場合は、その図のハンドルを明示的に指定します。
    figure(1); % 図1をアクティブにする
    plot(x1, y1);
    figure(2); % 図2をアクティブにする
    plot(x2, y2);
    
    savefig(1, 'plot1.png'); % 図1を保存
    savefig(2, 'plot2.png'); % 図2を保存
    
  • plotコマンドの後にdrawnowコマンドを追加して、描画処理が完了するのを待ちます。
    plot(x, y);
    drawnow; % 描画を強制的に更新
    savefig('myplot.png');
    

ファイル形式のサポートに関するエラー

原因

  • 特に、EPSやPDFなどのベクター形式の場合、Ghostscriptpstoeditといった外部ツールが必要となることがあります。PNGやJPEGなどのラスター形式でも、特定のライブラリ(例えばlibpng, libjpeg)が必要になる場合があります。
  • 指定したファイル拡張子がOctaveでサポートされていないか、必要な外部ライブラリがインストールされていない。

トラブルシューティング

  • print関数を検討する
    savefigがうまくいかない場合、より詳細なオプションを持つprint関数を試すことで解決する場合があります。
    print('myplot.pdf', '-dpdf'); % PDF形式で保存
    print('myplot.eps', '-depsc'); % EPS形式で保存
    
  • 一般的な形式を試す
    まずは、PNG (.png) やJPEG (.jpg) のような一般的なラスター形式で保存を試してみてください。これらの形式は、ほとんどの場合、追加の設定なしで動作します。
  • エラーメッセージを確認
    Octaveは通常、必要なツールが見つからない場合に具体的な警告やエラーメッセージを表示します。例えば、warning: print.m: epstool binary is not available. Some output formats are not available. のようなメッセージが出たら、epstoolをインストールする必要があります。
  • Octaveのインストールを確認
    Octaveをインストールする際に、グラフの出力に必要なパッケージや依存関係が正しくインストールされているか確認してください。OSによっては、これらの依存関係を手動でインストールする必要がある場合があります(例: Ubuntu/Debianならapt-get install ghostscript pstoedit、Fedora/RHELならyum install ghostscript pstoeditなど)。

ファイルの書き込み権限に関するエラー

原因

  • ファイル名に、OSで許可されていない特殊文字が含まれている。
  • 存在しないディレクトリを指定した。
  • 指定した保存先にファイルを書き込む権限がない。

トラブルシューティング

  • ファイル名の確認
    ファイル名にスラッシュ (/\) などのパス区切り文字以外の特殊文字が含まれていないことを確認します。
  • 保存先の確認
    • 現在の作業ディレクトリ (pwdコマンドで確認) に保存を試すか、書き込み権限のある別のディレクトリ (例: ホームディレクトリ、デスクトップなど) を指定します。
    • ディレクトリが存在しない場合は、mkdir('新しいディレクトリ名') で作成してから保存します。
    % 例: デスクトップに保存する場合 (Windows)
    % savefig('C:\Users\あなたのユーザー名\Desktop\myplot.png');
    % 例: ホームディレクトリに保存する場合 (Linux/macOS)
    % savefig('~/myplot.png');
    

出力された画像の品質が低い、またはサイズが大きい/小さい

原因

  • 画像サイズが意図と異なる。
  • デフォルトのDPI(dots per inch)設定が低い。

トラブルシューティング

  • 図のサイズを調整する
    プロットウィンドウのサイズを手動で変更するか、set(gcf, 'PaperPosition', [left bottom width height])のようなコマンドを使って図の紙のサイズを設定することで、出力される画像の物理的なサイズに影響を与えることができます。
  • print関数でDPIを指定する
    savefigには直接DPIを指定するオプションはありませんが、内部的にprint関数が使用されています。より細かい制御が必要な場合は、print関数を使ってDPIを設定できます。
    plot(x, y);
    print('myplot_highres.png', '-dpng', '-r300'); % 300 DPIでPNG保存
    

savefigがハングする、またはOctaveが応答しなくなる

原因

  • グラフィックバックエンド(FLTK, Qtなど)の問題や、OpenGLドライバーの問題。
  • 非常に複雑なプロット、大量のデータ、または多くの図を開いている場合に、メモリ不足や描画処理の負荷が高い。
  • システムのグラフィックドライバーを更新する
    オペレーティングシステム上のグラフィックドライバーが古いか破損している場合、描画処理に問題を引き起こすことがあります。ドライバーの更新を試してください。
  • Octaveのバージョンを確認する
    使用しているOctaveのバージョンが古い場合、バグが含まれている可能性があります。最新の安定版にアップデートすることを検討してください。
  • グラフィックバックエンドを変更する
    Octaveのグラフィックバックエンドを切り替えることで、問題が解決する場合があります。Octaveコマンドラインでgraphics_toolkit('gnuplot')graphics_toolkit('fltk')graphics_toolkit('qt')などを試して、動作を確認します。
    graphics_toolkit('gnuplot'); % または 'fltk', 'qt'
    plot(x, y);
    savefig('myplot.png');
    
  • メモリ使用量を監視する
    大量のデータを扱う場合、システムのメモリ使用量を監視し、不足していないか確認します。
  • シンプルなプロットで試す
    まずは非常にシンプルなプロット (plot(1:10);) でsavefigが正常に動作するか確認し、問題が特定のプロットの複雑さに起因するかを切り分けます。


例1:基本的なグラフのPNG形式での保存

最も基本的な使い方です。現在の作業ディレクトリに画像ファイルが保存されます。

% データ生成
x = linspace(0, 2*pi, 100);
y = sin(x);

% グラフの作成
plot(x, y, 'b-', 'LineWidth', 1.5);
title('サイン波のプロット');
xlabel('X軸');
ylabel('Y軸');
grid on;

% グラフをPNG形式で保存
% ファイル名に拡張子を含めます
savefig('sine_wave_plot.png');

disp('サイン波のグラフを sine_wave_plot.png として保存しました。');

例2:異なるフォーマットでの保存(PDFとJPEG)

ファイル名の拡張子を変えるだけで、異なるフォーマットで保存できます。

% データ生成
x = -5:0.1:5;
y1 = exp(-x.^2);
y2 = exp(-(x-2).^2);

% グラフの作成
plot(x, y1, 'r-', 'DisplayName', 'Gaussian 1');
hold on; % 複数のプロットを同じ軸に描画
plot(x, y2, 'g--', 'DisplayName', 'Gaussian 2');
hold off;
title('ガウス分布の比較');
xlabel('X値');
ylabel('確率密度');
legend('show');
grid on;

% グラフをPDF形式で保存(ベクトル形式でレポート向き)
savefig('gaussian_comparison.pdf');
disp('ガウス分布のグラフを gaussian_comparison.pdf として保存しました。');

% グラフをJPEG形式で保存(Webやプレゼンテーション向き)
savefig('gaussian_comparison.jpeg'); % または .jpg
disp('ガウス分布のグラフを gaussian_comparison.jpeg として保存しました。');

例3:特定の図の保存と保存先の指定

複数の図がある場合や、特定のディレクトリに保存したい場合に便利です。

% 最初の図を作成 (ハンドルh1を取得)
h1 = figure(1); % 図1
plot(1:10, rand(1,10), 'o-');
title('ランダムデータ その1');
xlabel('インデックス');
ylabel('値');

% 2番目の図を作成 (ハンドルh2を取得)
h2 = figure(2); % 図2
bar(1:5, [10 20 15 25 30], 'FaceColor', [0.8 0.2 0.2]);
title('棒グラフの例');
xlabel('カテゴリ');
ylabel('量');

% 保存先のディレクトリを指定 (例: 'output_plots' ディレクトリ)
output_dir = 'output_plots';
if ~exist(output_dir, 'dir') % ディレクトリが存在しない場合作成
    mkdir(output_dir);
    disp(['ディレクトリ "', output_dir, '" を作成しました。']);
end

% 図1を新しいディレクトリにPNGで保存
savefig(h1, fullfile(output_dir, 'random_data_plot.png'));
disp(['図1を ', fullfile(output_dir, 'random_data_plot.png'), ' として保存しました。']);

% 図2を新しいディレクトリにPDFで保存
savefig(h2, fullfile(output_dir, 'bar_chart_example.pdf'));
disp(['図2を ', fullfile(output_dir, 'bar_chart_example.pdf'), ' として保存しました。']);

% Octaveを終了する前に、ディレクトリの内容を確認できるメッセージ
disp(['全てのグラフは "', output_dir, '" ディレクトリに保存されています。']);

fullfile関数について: fullfileは、OSに依存しない形でファイルパスを結合するために使用します。Windowsでは\、Linux/macOSでは/がパス区切り文字として使われますが、fullfileを使うことで自動的に適切な区切り文字が選択されます。

例4:print関数を使った高解像度での保存

savefigはDPI(解像度)を直接指定するオプションがありませんが、print関数を使うことで詳細な出力設定が可能です。

% データ生成
t = 0:0.01:10;
y = exp(-0.1*t) .* cos(t);

% グラフの作成
plot(t, y, 'm-', 'LineWidth', 1.2);
title('減衰振動');
xlabel('時間 (s)');
ylabel('振幅');
grid on;

% `print`関数を使って高解像度(300 dpi)でPNG形式で保存
% `-dpng` はPNG形式を指定
% `-r300` は解像度を300 dpiに設定
print('decaying_oscillation_highres.png', '-dpng', '-r300');
disp('減衰振動のグラフを高解像度で decaying_oscillation_highres.png として保存しました。');

% 同じグラフをPostScript(EPS)形式で保存(論文や印刷物向き)
% `-depsc` はEncapsulated PostScript (カラー) を指定
print('decaying_oscillation_eps.eps', '-depsc');
disp('減衰振動のグラフを decaying_oscillation_eps.eps として保存しました。');
  • -tight: 余白を最小限に抑えます。
  • -bestfit: 印刷用紙に収まるように自動調整します。
  • -r<DPI>: 解像度をDPIで指定します。デフォルトは通常72-100DPI程度です。
  • -d<format>: 出力フォーマットを指定します(例: dpng, djpeg, dpdf, depsc, depsc2など)。


savefigの代替となる方法は、実質的にprint関数を使うことが最も一般的で強力な選択肢になります。savefigの内部でもprintが使われているため、printを直接使うことで、savefigでは提供されていない多くの詳細な制御が可能になります。

print関数は、Octaveのグラフを多様なフォーマットと詳細な設定で出力するための主要なツールです。

print関数の一般的な構文

print(filename, options)
print(h, filename, options) % 特定の図のハンドル h を指定する場合
  • filename: 保存するファイルのパスと名前。
  1. 出力フォーマットの指定 (-d<format_string>): savefigはファイル拡張子からフォーマットを推測しますが、printでは明示的に指定できます。

    • -dpng: PNG形式 (ラスター画像)
    • -djpeg: JPEG形式 (ラスター画像)
    • -dpdf: PDF形式 (ベクター画像、高品質)
    • -depsc: カラーEncapsulated PostScript (ベクター画像、印刷・論文向き)
    • -deps: モノクロEncapsulated PostScript
    • -dsvg: Scalable Vector Graphics (SVG形式、Web向き)
    • -dps: PostScript (一般的なPostScript)


    plot(x, y);
    print('my_plot.pdf', '-dpdf'); % PDFで保存
    print('my_plot.png', '-dpng'); % PNGで保存
    
  2. 解像度の指定 (-r<DPI>): 出力画像の解像度をDPI(dots per inch)で指定できます。savefigでは直接指定できませんが、printを使うことで高解像度の画像を作成できます。

    • -r72: 標準的な画面解像度
    • -r300: 印刷品質(推奨)
    • -r600: 高品質印刷


    plot(x, y);
    print('my_plot_highres.png', '-dpng', '-r300'); % 300 DPIでPNG保存
    
  3. 背景色の制御 (-transparent, -color, -mono): 画像の背景を透過させたり、カラー/モノクロを指定したりできます。

    • -transparent: 背景を透過 (PNGなどで有効)
    • -color: カラーで出力 (デフォルトだが明示的に)
    • -mono: モノクロで出力


    plot(x, y);
    print('my_plot_transparent.png', '-dpng', '-transparent'); % 背景透過PNG
    
  4. サイズと余白の制御 (-bestfit, -fillpage, -tight, -loose, -portrait, -landscape): 出力される画像のサイズや用紙への収まり方を細かく調整できます。

    • -bestfit: ページに収まるようにスケーリング。
    • -fillpage: ページ全体を埋めるようにスケーリング。
    • -tight: プロットの周囲の余白を最小限に抑える。
    • -loose: 余白を多めにとる (デフォルトに近い)。
    • -portrait: 縦向きで印刷。
    • -landscape: 横向きで印刷。


    plot(x, y);
    print('my_plot_tight.eps', '-depsc', '-tight'); % 余白を詰めたEPS
    
  5. 現在の図、または特定の図の指定: savefigと同様に、現在アクティブな図を保存するか、特定の図のハンドルを指定して保存するかを選択できます。


    h = figure; % 新しい図を作成し、ハンドルを取得
    plot(1:10, rand(1,10));
    print(h, 'my_figure_specific.pdf', '-dpdf'); % 特定の図をPDFで保存
    
  • 他の言語やツールとの連携: 非常に特殊な要件がある場合、Octaveでデータを処理し、その結果をファイルに保存した後、PythonのMatplotlibやRのggplot2などの他のプログラミング言語やツールでグラフを生成・保存するという方法も考えられます。しかし、これは通常、Octaveの機能で十分な場合に過剰なアプローチです。
  • スクリーンショット: オペレーティングシステムのスクリーンショット機能を使って、表示されているグラフを画像としてキャプチャする方法もあります。これは品質やフォーマットの制御が難しいですが、手早く画像が欲しい場合には有効です。
  • GUIからの手動保存: OctaveのGUIを使っている場合、図のウィンドウで「ファイル」メニューから「エクスポート」や「保存」を選択して手動で保存できます。これはプログラミングとは直接関係ありませんが、簡単な図を保存する際には便利です。