こんにちは、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つの形式の違いについてはこちらの記事をご覧ください。
PDFはベクタ形式の画像なので、次のようなメリットがあります。
- 拡大・縮小しても文字や図形の画質は劣化しない
- ラスタ形式の画像も含められる
- 大抵のデバイスで閲覧可能
- MicrosoftのWordやPowerPointにも貼れる(Mac限定)
論文用に作ったラスタ画像をポスターサイズに拡大なんかしてしまうと、かなり残念な見た目になってしまいます。
しかし、ベクタ画像のPDFであれば、拡大しても画質が劣化しないため、1つのファイルを使い回しできます。
(まぁ、実際には作り直すことの方が多いと思いますが。)
実験と解析を繰り返し、苦労の末に得られた研究成果を学会や論文で発表します。
これだけ頑張ったのだから、綺麗な図を作成して、見栄えの良い綺麗な論文・発表資料にしたいと思いませんか?
私は思います!
論文を読む側、学会で発表を聴く側の立場で考えても、綺麗で見やすい図表が並んでいる方が見る(聴く)気が湧きます。
研究の内容はもちろんですが、ぱっと見の印象も結構大事です!
ということで、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画像に変換しています。)
figure本体の周りにかなり広く余白がありますね。
PDF出力する場合に限り、A4サイズの白紙の中央にfigureが配置される仕様となっています。
余白が邪魔でかなり使いにくい…
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ファイルはこのようになります。
figure1のような不要な余白はなくなり、目的は達成できました!
サンプルコードの説明
サンプルコードの各行について説明します。
意味を理解した上で、自分用にカスタムして使いこなしてください!
まず、
f = figure;
によって、figureのプロパティにアクセスしやすい状態でfigureを作成します。
変数fは、figureの位置やサイズ、フォント、色などの情報が入っているオブジェクト(構造体のように扱えます)です。
f.〇〇という形で各プロパティにアクセスし、これらの値を変更することで、figureの外観などを変更できます。
figureの各プロパティについては、MathWorksの公式ドキュメントを参考にしてください。
次に、出力する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関数を使う方法が一番簡単だと思います。
本記事のはじめに紹介した自作コード(makeFigPDF関数)を使用した場合と、exportgraphics関数を使用した場合を比較すると、
となります。
exportgraphics関数を使うと、余白は本当に最小限になります。
一方で、私が作成したmakeFigPDF関数は、表示されている範囲全体を出力します。
出力されるPDFのサイズを厳密に指定したい場合や、figure周りにあえて少し余白をつけたい場合など、細かい設定をしたい場合には、exportgraphics関数は不向きだと思います。
以上を踏まえ、私はexportgraphics関数ではなくこの記事で説明した方法(makeFigPDF関数)を使うつもりです。
そこまで細かい設定は要らない!余白が消せたらそれでいい!という方は、exportgraphics関数を使うことをおすすめします。
exportgraphics関数はMATLAB 2020aから実装されました。
これより前のバージョンでは使用できない点にはご注意ください。
MATLAB 2014a以前のバージョン
figureなどのグラフィックオブジェクトのプロパティにに、ドット表記(f.〇〇という形)でアクセスできるようになったのはMATLAB 2014bからです。
MATLAB 2014a以前のバージョンを使用する場合、ドット表記の代わりにget関数とset関数を使う必要があります。
例えば、
f.PaperSize = f.Position(3:4);
というドット表記は、
pos = get(f, 'Position'); set(f, 'Position', pos(3:4));
に変更してください。
まとめ
今回は、MATLABで生成したfigureをPDF出力する際にできる不要な余白を消す方法を紹介しました。
本記事の最初にもご紹介したsaveFigPDF関数を使用していただくことで、簡単に実現できるので、ぜひご活用ください。
余白を完全に無くしたい場合には、MATLABに標準搭載のexportgraphics関数も便利です。
綺麗な図を作って、論文や発表資料のクオリティを上げていきましょう!
コメント