Help us understand the problem. What is going on with this article?

Matlab の図を余白のない pdf で保存する方法

More than 1 year has passed since last update.

このメモでは Matlab の図を無駄な余白のない pdf ファイルで保存する方法についてまとめます。

問題

普通に figure 画面で「ファイル」->「名前を付けて保存」から pdf 形式で保存をすると、次のような無駄に余白のある pdf ファイルができます。

image.png

png 形式で保存するとこんなに大きな余白はできないのですが、LaTeX でベクトル形式の図を貼りたかった私は pdf 形式でも無駄に大きな余白がない図を保存したいと思い、設定を調べてみました。

対処法

pdf への出力では印刷用の用紙サイズの設定が利用されているようなので、それを一旦変更してから保存を行うスクリプトを作成しました。

SaveFig.m
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 ファイルが生成されます。

image.png

無駄な余白のない pdf 形式の図が出力できました。

あとがき

今回は2年くらい調整しながら使い続けているスクリプトを紹介しました。
ちょっとしたスクリプトですので、私に責任を問わないという条件のもとであれば自由にコピペして構いません。ただ、役に立ったことをコメントやいいねで告げていただけると喜びます。

MusicScience37
東京在住のエンジニアです。C++, Python を中心に活動しています。主に Windows 10 か Ubuntu 18.04 / 20.04 上で何かをしています。
https://musicscience37.gitlab.io/til/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away