粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

MATLABで余計な余白をつけずに図を保存(MATLABの図問題 Ⅱ)

記事概要

plotで作ったfigureを保存する時の余白をなくしたい!
これに尽きます。

序盤は書き方について,記事最終部には関数化したものが置いてあります。

MATLABのsaveasで保存するときに余計な余白を作らない方法

MATLABが変な余白を突っ込むのは恐らくデフォルトの仕様なので
ここではきちんと図のサイズと位置を指定することで図を綺麗に保存するコードを参考文献から引っ張ってきました。

h = figure;
plot(1:10);

set(h,'Units','Inches');
pos = get(h,'Position');
set(h,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])

print(h,'FILENAME','-dpdf','-r0')

コードの簡単な解説

やっていることは至極単純で,図がある領域を測定してその結果を図のプロパティに保存してから図を保存しています。
一番の肝は最後のsetで'PaperSize'に測定したposを代入しているところのようです。

最後のprintは少し見慣れませんがsaveasと同様にファイルを保存できます。
引数の'-dpdf'がPDF形式でということと,’-r0’は表示されたままのサイズで図を保存するという命令を示しているようです。

余談:余白を狭くする

余談ですが,以下の様な呪文を唱えるともともとのfigureのマージンを狭めに設定できるようです。

set(gca, 'LooseInset', get(gca, 'TightInset'));

正直ちょっと狭くなり過ぎる気もします。

追記:imshowで見れる画像はimwriteで書き出しましょう(近々まとめます)

先ほどのPDFのCropの記事でいろいろ調べた結果,
MATLABの図を保存する時に余白を作らない方法を発見しました。

[参考ページ]
Tips & Tricks: How to get rid of the white margin in MATLAB's saveas or print outputs

実行例

写真をUPするのが面倒になったので以下のサンプルコードを実行して
test.pdfとtest_nm.pdf,test_nmt.pdf を開いて比較してみるといいでしょう。

%% margin
h = figure;
plot(1:10);

print(h,'test','-dpdf','-r0')

%% no_margin
i = figure;
plot(1:10);
set(i,'Units','Inches');
pos = get(i,'Position');
set(i,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])
print(i,'test_nm','-dpdf','-r0')

%% tight and no margin
j = figure;
plot(1:10);

set(gca, 'LooseInset', get(gca, 'TightInset'));
set(j,'Units','Inches');
pos = get(j,'Position');
set(j,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])

print(j,'test_nmt','-dpdf','-r0')

注意点

今のところはっきりとは検証しきれていないですが
この方法を用いるともとの手法とくらべて文字サイズが小さ目に出るような傾向がある気がします。
これもどうせsetでなんとかなるのですが,
今までとまんま同じ縮尺の図を出す必要がある場合などには少し困りますね…

追記 : 関数化しました

一連のコマンドを打つのが面倒なので関数にしました。
SaveFigPDFという名前(センスない)にして保存していただければsaveas関数と似たような使い心地で余白無しのPDFの図の保存が簡単に出来ます。

%% Matlabのfigureから余分な余白を生むこと無くPDFを生成する,
% 入力引数> fig : figure ハンドル, filename : 保存するファイル名(.pdfの前のみ)
% input >  fig : figure handle , filename : Filename before .pdf
%
% 使用例 (Example)
% f1 = figure;
% plot(1:10);
% SaveFigPDF(f1,'test')
%
% 
function y = SaveFigPDF(fig,filename)

% この下の行のコメントアウトを解除するとより余白を削ったPDFを作成します。
% set(gca, 'LooseInset', get(gca, 'TightInset'));

set(fig,'Units','Inches');
pos = get(fig,'Position');
set(fig,'PaperPositionMode','Auto','PaperUnits','Inches','PaperSize',[pos(3), pos(4)])

print(fig,filename,'-dpdf','-r0')
end