【MATLAB】figureをPDFで保存するときの余白を削除しよう!

こんにちは、Rayです。
MATLABのfigureをPDF形式で保存すると、figureの外側に余分な余白が付いてしまったり、figureが収まり切らなかったりしたことはありませんか?
この記事では、そんな時の対処法を紹介します。

記事の内容

この関数を使えば解決!

はじめに、便利な自作関数を紹介します!
figure作成後にこの関数を実行することで、指定されたファイル名(filename)でPDFファイルが出力されます。
もちろん、不必要な余白は含まれません。
コピペしても構いませんが、こちらからsaveFigPDF.mファイルをダウンロードすることも可能です。
ご自由にお使いください。

function saveFigPDF(filename)
% -------------------------------------------------------------------------
% 作成したfigureのサイズに合わせてPDF出力します.
% 出力したいfigureのウィンドウを選択した状態でこの関数を実行してください.
% -------------------------------------------------------------------------
% Format:
%   saveFigPDF('sample.pdf')
% -------------------------------------------------------------------------
% Input:
%   filename - 出力するPDFファイルのファイル名(char型,string型)
% -------------------------------------------------------------------------

if ischar(filename) || isstring(filename)
    filename = char(filename);
else
    error('引数はchar型かstring型で指定してください.')
end

% active figureを取得
f = gcf;

% 出力サイズをfigureサイズに合わせる
f.Units = 'centimeters';
f.PaperUnits = f.Units;
f.PaperPosition = [0, 0, f.Position(3:4)];
f.PaperSize = f.Position(3:4);

% figureをPDFで出力
print(filename, '-dpdf')

以下では、PDF余白問題に関する諸々をお話しします。
一度目を通して、理解を深めておくことをおすすめします!

figureをPDF形式で出力する目的

作成したfigureをPDFで保存する理由は、ずばり、

PDFは綺麗な上に扱いやすい!

からです。

ラスタ形式とベクタ形式

画像ファイルは、ラスター形式(ビットマップ形式)とベクター形式の2種類に大別されます。
ラスター形式の画像を拡大するとギザギザしますが、ベクター形式の画像は綺麗なまま拡大することができます。
2つの形式の違いについてはこちらの記事をご覧ください。

あわせて読みたい
【画像の種類】ラスタ形式とベクタ形式を使い分けよう こんにちは、Rayです。画像を大別すると、ラスタ形式とベクタ形式の2種類が存在します。この記事では、ラスタ形式とベクタ形式の違いを説明しようと思います。画像デー...

PDFはベクタ形式の画像なので、次のようなメリットがあります。

  • 拡大・縮小しても文字や図形の画質は劣化しない
  • ラスタ形式の画像も含められる
  • 大抵のデバイスで閲覧可能
  • MicrosoftのWordやPowerPointにも貼れる(Mac限定)

論文用に作ったラスタ画像をポスターサイズに拡大なんかしてしまうと、かなり残念な見た目になってしまいます。
しかし、ベクタ画像のPDFであれば、拡大しても画質が劣化しないため、1つのファイルを使い回しできます。
(まぁ、実際には作り直すことの方が多いと思いますが。)

実験と解析を繰り返し、苦労の末に得られた研究成果を学会や論文で発表します。
これだけ頑張ったのだから、綺麗な図を作成して、見栄えの良い綺麗な論文・発表資料にしたいと思いませんか?
私は思います!
論文を読む側、学会で発表を聴く側の立場で考えても、綺麗で見やすい図表が並んでいる方が見る(聴く)気が湧きます。

Ray

研究の内容はもちろんですが、ぱっと見の印象も結構大事です!

ということで、MATLABで作成したfigureをPDFで保存しよう!!
と言いたいところなのですが、少し工夫が必要です。

MATLABのfigureをPDF形式で保存すると…

例として適当なグラフを作図してみます。

% plotする変数を用意
x = 0:0.1:2*pi;
y = sin(x);

% figureにplot
figure
plot(x,y)

% figureをPDFファイルとして出力
print('figure1.pdf', '-dpdf')

出力されたPDFファイルはこんな感じになります。
(PDFをそのまま貼る事はできないので、 PING画像に変換しています。)

figure1

figure本体の周りにかなり広く余白がありますね。
PDF出力する場合に限り、A4サイズの白紙の中央にfigureが配置される仕様となっています。

Ray

余白が邪魔でかなり使いにくい…

figure部分だけを出力したい場合、

  • 他のソフトで、figure部分だけトリミングする
  • Illustratorなどのソフトで、figure部分のオブジェクトだけ抽出する
  • そもそもMATLABで出力する時点で、figure部分のみ出力する

などの対応が挙げられます。
1つ目と2つ目の方法は、figure作成後に追加処理が必要なので面倒です。
そこで本記事では、MATLABだけで完結する3つ目の方法を簡単に紹介します。

figureサイズに合わせてPDFファイルのサイズを変更する方法

ここからが本題です!
まずは目的を達成するためのサンプルコードを紹介します。
その後、サンプルコードの各行について説明を加えます。

サンプルコード

figureサイズに合わせてPDF出力するサンプルコードです。

% plotする変数を用意
x = 0:0.1:2*pi;
y = sin(x);

% figureにplot
f = figure;
plot(x, y)

% 出力サイズをfigureサイズに合わせる
f.Units = 'centimeters';
f.PaperUnits = f.Units;
f.PaperPosition = [0, 0, f.Position(3:4)];
f.PaperSize = f.Position(3:4);

% figureをPDFで出力
print('figure2.pdf', '-dpdf')

こちらのコードで出力されるPDFファイルはこのようになります。

figure2

figure1のような不要な余白はなくなり、目的は達成できました!

サンプルコードの説明

サンプルコードの各行について説明します。
意味を理解した上で、自分用にカスタムして使いこなしてください!

まず、

f = figure;

によって、figureのプロパティにアクセスしやすい状態でfigureを作成します。
変数fは、figureの位置やサイズ、フォント、色などの情報が入っているオブジェクト(構造体のように扱えます)です。
f.〇〇という形で各プロパティにアクセスし、これらの値を変更することで、figureの外観などを変更できます。
figureの各プロパティについては、MathWorksの公式ドキュメントを参考にしてください。

あわせて読みたい
Figure - Figure ウィンドウの外観と動作の制御 - MATLAB - MathWorks 日本 Figure は、グラフィックス コンポーネントまたはユーザー インターフェイス コンポーネントのコンテナーです。

次に、出力するPDFのサイズをfigureのサイズに合わせるための準備をします。

f.Units = 'centimeters';
f.PaperUnits = f.Units;

ここで変更している各プロパティは、

  • Units:figureサイズの単位
  • PaperUnits:PDF出力する際のサイズの単位

を表しています。
どちらも’centimeter’(cm)に統一させます。

備考

Unitsのデフォルトとなっている’pixels’は、PaperUnitsが対応していないので、変更が必須です。
統一するのは’centimeter’でなくても構いませんが、印刷することを考えると’centimeters’が使いやすいと思います。

さて、ついにPDFのページサイズをfigureサイズに合わせます。

f.PaperPosition = [0, 0, f.Position(3:4)];
f.PaperSize = f.Position(3:4);

figureのPaperPositionとPaperSizeを、figureのPositionに合わせます。
それぞれのプロパティの詳細は、別記事で説明します。

ここまでの処理によって、出力されるPDFのサイズが、figureのサイズに合わせられました。
ということで、

print('figure2.pdf', '-dpdf')

でPDF出力すると、不要な余白がないPDFファイルが生成されるわけです!

数行のコードを追記するだけで簡単にPDFの余白を消すことができました!

MATLABのバージョンによってこんな方法も

MATLAB 2020a以降のバージョン

PDF出力する時の余白を最小限にしたい場合、exportgraphics関数を使う方法が一番簡単だと思います。

あわせて読みたい
exportgraphics - プロットまたはグラフィックスの内容をファイルに保存する - MATLAB - MathWorks 日本 この MATLAB 関数 は、obj で指定されたグラフィックス オブジェクトの内容をファイルに保存します。

本記事のはじめに紹介した自作コード(makeFigPDF関数)を使用した場合と、exportgraphics関数を使用した場合を比較すると、

となります。
exportgraphics関数を使うと、余白は本当に最小限になります。
一方で、私が作成したmakeFigPDF関数は、表示されている範囲全体を出力します。

出力されるPDFのサイズを厳密に指定したい場合や、figure周りにあえて少し余白をつけたい場合など、細かい設定をしたい場合には、exportgraphics関数は不向きだと思います。

以上を踏まえ、私はexportgraphics関数ではなくこの記事で説明した方法(makeFigPDF関数)を使うつもりです。
そこまで細かい設定は要らない!余白が消せたらそれでいい!という方は、exportgraphics関数を使うことをおすすめします。

注意

exportgraphics関数はMATLAB 2020aから実装されました。
これより前のバージョンでは使用できない点にはご注意ください。

MATLAB 2014a以前のバージョン

figureなどのグラフィックオブジェクトのプロパティにに、ドット表記(f.〇〇という形)でアクセスできるようになったのはMATLAB 2014bからです。
MATLAB 2014a以前のバージョンを使用する場合、ドット表記の代わりにget関数set関数を使う必要があります。

あわせて読みたい
get - グラフィックス オブジェクトのプロパティのクエリ - MATLAB - MathWorks 日本 この MATLAB 関数 は、指定したグラフィックス オブジェクト h のプロパティおよびプロパティ値をコマンド ウィンドウに表示します。
あわせて読みたい
set - グラフィックス オブジェクトのプロパティの設定 - MATLAB - MathWorks 日本 この MATLAB 関数 は、1 つ以上の名前と値の引数を使用して、指定したグラフィックス オブジェクト h のプロパティを設定します。

例えば、

f.PaperSize = f.Position(3:4);

というドット表記は、

pos = get(f, 'Position');
set(f, 'Position', pos(3:4));

に変更してください。

まとめ

今回は、MATLABで生成したfigureをPDF出力する際にできる不要な余白を消す方法を紹介しました。
本記事の最初にもご紹介したsaveFigPDF関数を使用していただくことで、簡単に実現できるので、ぜひご活用ください。
余白を完全に無くしたい場合には、MATLABに標準搭載のexportgraphics関数も便利です。

綺麗な図を作って、論文や発表資料のクオリティを上げていきましょう!

シェアおねがいします!
  • URLをコピーしました!

この記事を書いた人

脳神経科学を専攻する大学院生です。
研究に取り組む中で直面した問題や、役に立ちそうな情報を共有しています。
趣味で撮っている写真も投稿していますので、よかったら見に来てください!

コメント

コメントする

記事の内容