このメモでは Matlab の図を無駄な余白のない pdf ファイルで保存する方法についてまとめます。
問題
普通に figure 画面で「ファイル」->「名前を付けて保存」から pdf 形式で保存をすると、次のような無駄に余白のある pdf ファイルができます。
png 形式で保存するとこんなに大きな余白はできないのですが、LaTeX でベクトル形式の図を貼りたかった私は pdf 形式でも無駄に大きな余白がない図を保存したいと思い、設定を調べてみました。
対処法
pdf への出力では印刷用の用紙サイズの設定が利用されているようなので、それを一旦変更してから保存を行うスクリプトを作成しました。
function SaveFig(fig, filename)
%
% SaveFig(fig, filename)
%
% 引数figに指定されたfigureをfilenameの名前のpng,pdfファイルで保存する。
% filenameは拡張子をつけない。
%
% 例:SaveFig(figure(1),'example')
% 終わってない描画処理があったら終わらせる
drawnow;
% 紙のサイズを変える。
temp.figunit = fig.Units;
fig.Units = 'centimeters';
pos = fig.Position;
fig.PaperPositionMode = 'Auto';
temp.figpaperunit = fig.PaperUnits;
fig.PaperUnits = 'centimeters';
temp.figsize = fig.PaperSize;
fig.PaperSize = [pos(3), pos(4)];
% 保存する。
print(fig,filename,'-dpdf','-r300','-bestfit')
print(fig,filename,'-dpng','-r300')
% 設定を元に戻す。
fig.PaperSize = temp.figsize;
fig.Units = temp.figunit;
fig.PaperUnits = temp.figpaperunit;
end
なお、この関数は png 形式の図も一緒に作っています。
(png の方が Microsoft Office では使いやすい。)
この関数を使って、例えば
h = figure;
fplot(@sin);
xlabel('x');
ylabel('y');
title('y=sin(x)');
SaveFig(h,'test');
とすると、次のような test.pdf ファイルが生成されます。
無駄な余白のない pdf 形式の図が出力できました。
あとがき
今回は2年くらい調整しながら使い続けているスクリプトを紹介しました。
ちょっとしたスクリプトですので、私に責任を問わないという条件のもとであれば自由にコピペして構いません。ただ、役に立ったことをコメントやいいねで告げていただけると喜びます。