saveas

2025-05-26

saveasの基本的な機能

saveas関数は、表示されている図を様々な画像形式で保存するために使用されます。例えば、PNG、JPEG、PDF、PostScriptなどの形式で保存できます。

構文

基本的な構文は以下の通りです。

  1. saveas(h, filename)
  2. saveas(h, filename, fmt)

パラメータの説明

  • fmt: 保存する画像フォーマットを文字列で指定します。filenameに拡張子が含まれていない場合にこの引数を使用すると、指定したフォーマットで保存され、自動的に適切な拡張子が追加されます。print関数でサポートされているすべてのデバイスフォーマットが利用可能です。
  • filename: 保存するファイルの名前を文字列で指定します。例えば 'myplot.png' のように、ファイル拡張子を含めて指定すると、その拡張子に対応する形式で保存されます。
  • h: 保存したいグラフィックオブジェクトのハンドル(識別子)です。通常、現在アクティブな図を保存する場合はgcf("get current figure"の略)を使用します。

一般的なフォーマットの例

  • 'emf' (Enhanced Metafile - Windowsのみ)
  • 'png' (PNG Image)
  • 'jpg' (JPEG Image)
  • 'pdf' (Portable Document Format)
  • 'eps' (Encapsulated PostScript)
  • 'ps' (PostScript)

使用例

以下にいくつかの使用例を示します。

例1: 現在の図をPNG形式で保存する

x = 0:0.1:2*pi;
y = sin(x);
plot(x, y);
saveas(gcf, 'sine_wave.png');

このコードは、サインカーブのプロットを作成し、それをsine_wave.pngという名前のPNGファイルとして保存します。gcfは現在アクティブな図のハンドルを取得します。

例2: 特定の図をPDF形式で保存する

複数の図を開いている場合、特定の図を保存することもできます。

figure(1); % 図1を作成してアクティブにする
plot(rand(1, 10));
title('Random Plot 1');

figure(2); % 図2を作成してアクティブにする
plot(sin(linspace(0, 10)));
title('Sine Wave');

saveas(1, 'random_plot.pdf'); % 図1をPDF形式で保存
saveas(2, 'sine_wave_plot', 'jpg'); % 図2をJPEG形式で保存(拡張子なしでフォーマット指定)

この例では、figure(1)figure(2)という2つの図を作成し、それぞれのハンドル(1と2)を使って個別に保存しています。

Octaveには、saveasと同様に図を保存するprint関数もあります。

  • saveas: よりシンプルで、特定のファイル形式で図を保存するのに便利です。通常、よく使われるフォーマットへの出力が目的であれば、saveasで十分です。
  • print: より多くのオプション(解像度、用紙サイズ、モノクロ/カラーなど)を細かく制御できます。汎用性が高く、より詳細な出力設定が必要な場合に適しています。

内部的には、saveasprint関数を呼び出していることが多いです。



グラフィックツールキットに関する問題 (Graphics Toolkit Issues)

Octaveはプロットの描画に「グラフィックツールキット」を使用します。デフォルトはgnuplotですが、qtfltkなども利用可能です。saveasprintで問題が発生する場合、ツールキットが原因であることがあります。

  • トラブルシューティング:

    • グラフィックツールキットの変更: 現在使用しているツールキットを確認し、別のものに切り替えてみてください。

      graphics_toolkit % 現在のツールキットを確認
      graphics_toolkit('gnuplot'); % gnuplot に切り替え
      % または
      % graphics_toolkit('qt'); % qt に切り替え
      % graphics_toolkit('fltk'); % fltk に切り替え
      

      ツールキットを変更した後、再度saveasを試してください。特にWindows環境ではgnuplotが安定していることが多いです。

    • 必要なライブラリのインストール: もし特定のエラーメッセージ(例: gl2psがない)が表示された場合、そのライブラリをシステムにインストールする必要があります。Octaveをインストールした方法(パッケージマネージャー、公式サイトからのダウンロードなど)によってインストール方法が異なります。

  • 原因:

    • 必要なバックエンドライブラリ(gl2psなど)がインストールされていない、または正しく設定されていない。
    • 選択しているグラフィックツールキットが、使用しているシステムやOctaveのバージョンでうまく動作しない。
  • エラー例:

    • error: fltk: printing not available without gl2ps library
    • error: __gnuplot_print__: some unknown error
    • プロットは表示されるのに保存できない。

ファイル名またはパスに関する問題 (Filename or Path Issues)

ファイル名や保存先のパスに問題があると、保存が失敗することがあります。

  • トラブルシューティング:

    • シンプルなファイル名を使用する: まずは、アルファベットと数字、アンダースコアのみで構成されるシンプルなファイル名(例: 'myplot.png')で試してください。
    • パスの確認: pwdコマンドで現在の作業ディレクトリを確認し、そこに保存できるか試してください。
      plot(1:10);
      saveas(gcf, 'test_plot.png'); % 現在のディレクトリに保存
      
      特定のディレクトリに保存したい場合は、絶対パスを指定するか、mkdirで事前にディレクトリを作成してください。
      mkdir('output_plots'); % ディレクトリを作成
      saveas(gcf, 'output_plots/myplot.pdf'); % 相対パスで指定
      
    • フルパスとfullfileの使用: 特にOS間の互換性を考慮する場合や、パスの結合が複雑になる場合は、fullfile関数を使用すると安全です。
      output_dir = 'C:/Users/YourName/Documents/OctavePlots'; % Windowsの場合
      % または output_dir = '/home/YourName/OctavePlots'; % Linux/macOSの場合
      filename = 'my_figure.png';
      full_path = fullfile(output_dir, filename);
      saveas(gcf, full_path);
      
    • スペースを含むファイル名: ファイル名にスペースを含めたい場合は、単一の文字列として渡すようにしてください。通常、Octaveの文字列は空白を正しく扱いますが、環境によっては問題になることがあります。
      saveas(gcf, 'My Plot with Spaces.png');
      
    • 権限の確認: 保存先のディレクトリに対する書き込み権限があるか確認してください。管理者権限が必要な場所(例: C:\Program Files内)には保存しないようにしましょう。
  • 原因:

    • 不正な文字: ファイル名にWindowsやLinuxで許可されていない文字(/, \, :, *, ?, ", <, >, |など)が含まれている。
    • スペースを含むファイル名: ファイル名にスペースが含まれる場合、適切に引用符で囲まれていない。
    • 存在しないディレクトリ: 指定されたパスにディレクトリが存在しない。
    • 書き込み権限がない: 指定されたディレクトリにファイルを書き込む権限がない。
  • エラー例:

    • error: saveas: invalid filename
    • Error: saveas: unable to open file
    • ファイルが保存されない、または意図しない場所に保存される。

図のハンドルに関する問題 (Figure Handle Issues)

saveas関数は、どの図を保存するかを示す「ハンドル」を必要とします。

  • トラブルシューティング:

    • gcfを使用する: 現在アクティブな図を保存したい場合は、gcfを使用するのが最も確実です。
      plot(1:10); % 新しい図を作成し、それがアクティブになる
      saveas(gcf, 'current_figure.png');
      
    • 明示的に図を作成・指定する: 複数の図を操作している場合、それぞれの図にハンドルを割り当てて保存します。
      h1 = figure(1); % 図1を作成
      plot(sin(linspace(0, 2*pi)));
      
      h2 = figure(2); % 図2を作成
      plot(cos(linspace(0, 2*pi)));
      
      saveas(h1, 'figure1.png'); % 図1を保存
      saveas(h2, 'figure2.png'); % 図2を保存
      
      figure(1)のように数字で指定することもできますが、h1 = figure(1)のように変数に格納すると、後でコードが読みやすくなります。
  • 原因:

    • saveasの最初の引数に有効な図のハンドルが渡されていない。
    • 複数の図がある場合、保存したい図のハンドルが正しく指定されていない。
  • エラー例:

    • error: saveas: invalid graphics handle
    • 意図しない図が保存される。
    • 何も保存されない。

出力フォーマットに関する問題 (Output Format Issues)

指定した出力フォーマットがサポートされていない場合や、そのフォーマットに必要な設定が不足している場合にエラーが発生します。

  • トラブルシューティング:

    • 一般的なフォーマットで試す: まずは、'png''jpg'など、最も一般的な画像形式で保存できるか試してください。これらがうまくいけば、他の形式に問題があることがわかります。
      saveas(gcf, 'myplot.png');
      saveas(gcf, 'myplot.jpg');
      
    • printコマンドでの詳細設定: saveasで問題が解決しない場合、より低レベルで詳細な設定が可能なprint関数を試してみてください。
      % 解像度を指定してPNGで保存
      print('myplot_highres.png', '-dpng', '-r300'); 
      % PDFで保存
      print('myplot.pdf', '-dpdf');
      
      print関数のヘルプ(help print)を参照して、利用可能なデバイスオプションを確認してください。
  • 原因:

    • サポートされていないファイル形式を指定した。
    • 特定の形式(例: EPS、PDF)で問題が発生する場合、PostScriptフォントやGnuplotの設定が不適切である可能性がある。
  • エラー例:

    • error: print: unknown output format 'xyz'
    • 保存された画像が空白、または正しく表示されない。

まれに、Octave自体のバグやインストールが正しく行われていないことが原因でsaveasが動作しない場合があります。

  • トラブルシューティング:

    • Octaveのアップデート: 最新バージョンのOctaveにアップデートすることで、既知のバグが修正されている可能性があります。
    • 再インストール: もし可能であれば、Octaveを完全にアンインストールし、再インストールを試みてください。特に、グラフィックツールキット関連のライブラリ(Gnuplotなど)が正しくインストールされることを確認してください。
    • コミュニティでの情報収集: Octaveの公式フォーラムやStack Overflowなどで、同じような問題に遭遇している人がいないか検索してみてください。特定のバージョンやOSでの既知の問題が見つかるかもしれません。
  • 原因:

    • Octaveのバージョンが古い、または特定のOS環境で既知のバグがある。
    • インストール時にグラフィック関連のコンポーネントが正しくインストールされなかった。


例1: 基本的なプロットのPNG形式での保存

最も一般的なケースです。サイン波のプロットを作成し、それをPNGファイルとして保存します。

% 1. データの準備
x = linspace(0, 2*pi, 100); % 0から2πまで100点のx値
y = sin(x); % xに対するサイン波のy値

% 2. プロットの作成
plot(x, y, 'b-', 'LineWidth', 2); % 青い実線でプロット、線幅を2に設定
title('Sine Wave Example'); % タイトルを設定
xlabel('X-axis'); % X軸ラベルを設定
ylabel('Y-axis'); % Y軸ラベルを設定
grid on; % グリッドを表示

% 3. プロットをファイルに保存
% gcf は「get current figure」(現在の図を取得)の略です。
% 'sine_wave.png' は保存するファイル名です。拡張子でファイル形式が指定されます。
saveas(gcf, 'sine_wave.png');

disp('サイン波のプロットが sine_wave.png として保存されました。');

解説:

  • 'sine_wave.png': 保存するファイル名です。.pngという拡張子を付けることで、自動的にPNG形式で保存されます。
  • gcf: 現在アクティブな図のハンドル(識別子)を取得します。これにより、saveasはどの図を保存すべきかを知ることができます。
  • plot(x, y, ...): サイン波をプロットします。
  • linspace(0, 2*pi, 100): 0から2πまでの範囲で100個の等間隔な点を生成します。

例2: 複数のプロットを異なるファイル形式で保存

複数の図を作成し、それぞれを異なる形式(PDF, JPEG)で保存する例です。

% 1. 最初の図を作成 (Figure 1)
figure(1); % 新しい図ウィンドウ(ID: 1)を作成し、アクティブにする
x1 = -5:0.1:5;
y1 = x1.^2;
plot(x1, y1, 'r--', 'LineWidth', 1.5);
title('Parabola');
xlabel('X');
ylabel('Y');
grid on;

% 2. 最初の図をPDF形式で保存
% ここでは、figure(1) のハンドルとして数値の '1' を直接指定しています。
saveas(1, 'parabola_plot.pdf');
disp('放物線のプロットが parabola_plot.pdf として保存されました。');

% 3. 二番目の図を作成 (Figure 2)
figure(2); % 新しい図ウィンドウ(ID: 2)を作成し、アクティブにする
x2 = linspace(0, 4*pi, 200);
y2 = cos(x2) .* exp(-0.1*x2); % 減衰するコサイン波
plot(x2, y2, 'g:', 'LineWidth', 1.5);
title('Damped Cosine Wave');
xlabel('Time');
ylabel('Amplitude');
grid on;

% 4. 二番目の図をJPEG形式で保存
% ファイル名に拡張子を含めずに、3番目の引数でフォーマットを指定することもできます。
saveas(2, 'damped_cosine_plot', 'jpg');
disp('減衰コサイン波のプロットが damped_cosine_plot.jpg として保存されました。');

解説:

  • saveas(2, 'damped_cosine_plot', 'jpg'): 図2をdamped_cosine_plot.jpgとして保存します。この場合、ファイル名に拡張子が含まれていないため、3番目の引数'jpg'で明示的にフォーマットを指定しています。saveasが自動的に.jpg拡張子を追加します。
  • saveas(1, 'parabola_plot.pdf'): 図1をparabola_plot.pdfとして保存します。
  • figure(1)figure(2): それぞれ異なる図ウィンドウを作成し、アクティブにします。これにより、それぞれのプロットが独立したウィンドウに表示されます。

プロットを特定のフォルダに保存し、ファイル名を日付や時間など動的に生成する例です。

% 1. 保存先ディレクトリの指定と作成
output_dir = 'my_octave_plots'; % 相対パスでディレクトリ名を指定
if ~exist(output_dir, 'dir') % ディレクトリが存在しない場合
    mkdir(output_dir); % ディレクトリを作成
    disp(['ディレクトリ "', output_dir, '" を作成しました。']);
end

% 2. 現在の日時を取得してファイル名に組み込む
current_datetime = datestr(now, 'yyyy-mm-dd_HH-MM-SS'); % 例: '2025-05-25_22-04-41'
base_filename = ['random_data_plot_', current_datetime]; % 基本ファイル名

% 3. プロットの作成
plot(rand(1, 50), 'ko-', 'MarkerSize', 5, 'LineWidth', 1); % 黒丸線で乱数をプロット
title(['Random Data (Generated on ', current_datetime, ')']);
xlabel('Index');
ylabel('Value');
grid on;

% 4. フルパスを生成して保存
% fullfile は、OSのパス区切り文字(Windowsでは '\'、Linux/macOSでは '/')を適切に処理してパスを結合します。
full_path_png = fullfile(output_dir, [base_filename, '.png']);
full_path_eps = fullfile(output_dir, [base_filename, '.eps']); % EPS形式(出版品質に良く使われる)

saveas(gcf, full_path_png);
saveas(gcf, full_path_eps); % 同じ図をEPS形式でも保存

disp(['乱数プロットが ', full_path_png, ' および ', full_path_eps, ' として保存されました。']);

解説:

  • .eps形式は、Scalable Vector Graphics (SVG) のようなベクター形式であり、拡大しても画質が劣化しないため、論文や高品質なドキュメントでよく使用されます。
  • fullfile(output_dir, [base_filename, '.png']): output_dirと生成されたファイル名を結合して、完全なファイルパスを作成します。これにより、WindowsとLinux/macOSの両方でパスが正しく機能します。
  • datestr(now, 'yyyy-mm-dd_HH-MM-SS'): 現在の日時をYYYY-MM-DD_HH-MM-SS形式の文字列として取得します。nowは現在の日付と時刻を表すシリアル値を返します。
  • mkdir(output_dir): ディレクトリが存在しない場合、作成します。
  • if ~exist(output_dir, 'dir'): 指定したディレクトリが存在するかどうかを確認します。
  • output_dir = 'my_octave_plots';: 保存先のディレクトリ名を定義します。


print 関数 (最も一般的な代替方法)

saveasは内部的にprint関数を呼び出していることが多いため、printsaveasよりも低レベルで、より多くの制御オプションを提供します。

  • いつ使うか:

    • saveasではできない細かい設定(解像度、透明度、特定のEPS/PDFオプションなど)が必要な場合。
    • スクリプト内で異なる要件を持つ複数のプロットを保存する場合。
  • 使用例:

    % データの準備
    x = 0:0.1:2*pi;
    y = cos(x);
    plot(x, y);
    title('Cosine Wave');
    xlabel('X');
    ylabel('Y');
    grid on;
    
    % 例1: 高解像度PNGで保存 (300 DPI)
    print('cosine_wave_300dpi.png', '-dpng', '-r300');
    disp('高解像度PNGとして保存しました。');
    
    % 例2: PDF形式で保存
    print('cosine_wave.pdf', '-dpdf');
    disp('PDFとして保存しました。');
    
    % 例3: 背景を透明にしたEPS形式で保存 (出版用によく使われる)
    print('cosine_wave_transparent.eps', '-depsc', '-transparent');
    disp('透明背景EPSとして保存しました。');
    
    % 例4: 特定の図をJPEG形式で保存 (図のハンドルを指定)
    h_fig = figure; % 新しい図を作成し、ハンドルを取得
    plot(rand(1, 20));
    title('Random Plot');
    print(h_fig, 'random_plot.jpg', '-djpeg');
    disp('ランダムプロットをJPEGとして保存しました。');
    
  • 主な利点:

    • 詳細な制御: 出力形式(PNG, JPEG, PDF, EPS, TIFFなど)、解像度(DPI)、背景色、用紙サイズ、モノクロ/カラーなど、非常に多くのオプションを細かく設定できます。
    • 複数のデバイスタイプ: print関数は、プリンターデバイスだけでなく、様々な画像ファイル形式にも対応しています。
  • 構文: print(filename, options) または print(h, filename, options)

    • h: 保存したいグラフィックオブジェクトのハンドル(省略すると現在の図)。
    • filename: 保存するファイル名。
    • options: フォーマット、解像度、サイズなどの様々な設定を指定する文字列。

imwrite 関数 (画像データの直接保存)

imwriteはグラフィックオブジェクトを直接操作するのではなく、行列として表現された画像データをファイルに保存するために使用されます。これは、Octaveでカスタム画像(例: image関数で作成した画像、行列演算で生成した画像)を生成し、それをファイルに保存したい場合に非常に便利です。

  • いつ使うか:

    • plot関数ではなく、imageimagescなどで表示されるような生の画像データを保存したい場合。
    • 画像処理の結果をファイルに保存する場合。
  • 使用例:

    % 例1: グレースケール画像の生成と保存
    img_gray = zeros(100, 100); % 100x100の黒い画像
    img_gray(25:75, 25:75) = 1; % 中央に白い四角を描画
    
    imwrite(img_gray, 'gray_square.png');
    disp('グレースケール画像が gray_square.png として保存されました。');
    
    % 例2: RGBカラー画像の生成と保存
    img_rgb = zeros(100, 100, 3); % 100x100の黒いRGB画像
    img_rgb(:, :, 1) = linspace(0, 1, 100)' * ones(1, 100); % 赤チャンネルにグラデーション
    img_rgb(:, :, 2) = ones(100, 1) * linspace(0, 1, 100); % 緑チャンネルにグラデーション
    % 青チャンネルは0のまま
    
    imwrite(img_rgb, 'rgb_gradient.jpg');
    disp('RGB画像が rgb_gradient.jpg として保存されました。');
    
  • 主な利点:

    • グラフィックシステムに依存しない画像の保存。
    • プロット以外の、純粋な画像データを扱う場合に最適。
  • 構文: imwrite(A, filename, fmt)

    • A: 保存する画像データ(行列)。グレースケール画像の場合は2次元配列、RGB画像の場合は3次元配列(M x N x 3)。
    • filename: 保存するファイル名。
    • fmt: フォーマット(例: 'png', 'jpg', 'bmp'など)。

Octaveが使用するグラフィックツールキット(Gnuplot, Qt, FLTKなど)によっては、そのツールキットの機能を直接利用して画像を保存できる場合があります。これはOctaveの標準機能ではありませんが、特定の高度なニーズに対応できることがあります。

  • いつ使うか:

    • printsaveasでは実現できないGnuplot固有の機能が必要な場合。
    • Gnuplotのワークフローに慣れていて、それを直接利用したい場合。
  • 主な欠点:

    • Gnuplotの知識が必要。
    • Octaveのポータビリティが低下する(Gnuplot以外のツールキットでは動作しない)。
    • 通常はprintで十分であり、複雑になりがち。
  • 主な利点:

    • Gnuplotの持つすべての機能にアクセスできる。
    • 非常に細かいカスタマイズが可能。
  • Gnuplotの場合: GnuplotはOctaveのデフォルトのプロットエンジンであり、そのコマンドをOctaveから直接発行できます。

    % プロットを作成
    plot(sin(0:0.1:2*pi));
    
    % Gnuplotのコマンドを直接実行して保存
    gset output 'my_gnuplot_plot.png'; % 出力ファイルを設定
    gset terminal pngcairo; % ターミナル(出力形式)を設定
    greplot; % 現在のプロットを再描画してファイルに書き出す
    gset output; % 出力ファイルをリセット (重要!)
    gset terminal qt; % ターミナルをQtに戻す (もしQtを使っているなら)
    
  • グラフィックツールキットの直接操作: Gnuplotなどのバックエンドの機能を直接利用する高度な方法。特別な要件がある場合に限定的。
  • imwrite: プロットではなく、行列として存在する純粋な画像データを保存する場合。
  • print: saveasの機能に加え、解像度や特定のファイル形式オプションなど、より詳細な制御が必要な場合に利用。ほとんどのニーズに対応できる万能な方法。
  • saveas: 最もシンプルで、一般的な用途(PNG, JPEG, PDFなど)に最適。