はじめに
MATLAB で複数のグラフをまとめて表示するとき、昔からよく使われているのが subplot です。昔から沢山お世話になっている関数の一つです。しかしながら、最近、MathWorks 公式からは新しい機能である tiledlayout を使うことが推奨されています。
「推奨されているのは理解しているけど、考え方も馴染めそうにないし、手癖でついついsubplotをつかってしまう…」と思い続けていましたが「ここで頑張って卒業してみよう」と思い立ちました。公式HPで調べているうちに、subplotの考え方と同じようにtiledlayoutが使えることが分かりました。この記事では、subplotユーザーがtiledlayout へ乗り換えるために「できるだけ今まで通りの考え方で使えないか」をコンセプトにお伝えできれば思います。
subplot とは?
一度subplotについて振り返ってみます。subplotの特徴といえば、「subplot(3,2,4) のように行列形式で呼び出し、どの位置に表示するかを指定する」といったものだと思います。以下の例では、「3行2列の軸(描写枠)を作って、その4番目にグラフをプロットする」コードです。出力するFigrueと大まかなイメージを記しています。「行列の形で定義して、狙いの場所にプロットする」というイメージで、昔から使わせていただいています。
clear;
[x1,y1,z1] = peaks;
figure
subplot(3,2,4)
contourf(x1,y1,z1)
出力画像

行列の番号

tiledlayout とは?
subplotが推奨されなくなってきて、代わりに登場したのがtiledlayoutです。サンプルコードと出力例を見てみましょう。”tiledlayout( m , n )” で、subplotと同様にm×nの行列の形で配置できるようです。ここまで来て、少し気になる表現があります。”nexttile”です。名前からして、ずっと”nexttile”を「次のタイルに進む」だけの関数だと思い込んでいました。この思い込みから、”nexttile”の使い方や考え方がよく分からず、subplotからの卒業ができなかったものと反省しています。
clear
figure
tiledlayout(2,2);
[X,Y,Z] = peaks(20);
% Tile 1
nexttile
surf(X,Y,Z)
% Tile 2
nexttile
contour(X,Y,Z)
% Tile 3
nexttile
imagesc(Z)
% Tile 4
nexttile
plot3(X,Y,Z)

“subplot”ユーザー向けのnexttileの考え方
”nexttile”自体の扱い方は公式HPに記載されていますが、一通りドキュメントを拝見したなかで、subplotを使ってきた自分自身に一番馴染みのある使い方が“nexttile( タイル番号 )”でした。次のように狙った位置にプロットすることができます。
clear;
[x1,y1,z1] = peaks;
figure
tiledlayout(3,2)
nexttile(4)
contourf(x1,y1,z1)

subplotとtiledlayoutの書き方を比較
subplotと比較すると次のように考えることができるかと思います。個人的にはこの視方でみれるようになっただけでも、かなり”tiledlayout”になじめるようになってきました。

subplotの一人のユーザーとして気になること
ここまでで”tiledlayout”を使って、m×n行列での分割と分割位置を指定できることが分かりました。ですが、長年subplotを使い続けてきた人間として「完全に移行できるな」となるまでには、まだもう少しハードルがあります。主に次の2つが気になりました。
- 複数の分割箇所を結合できるか
- (結合できた場合に)指定する分割位置の番号は変化するか
tiledlayoutでこだわりの形にしてみる
先ほど挙げた2点の気がかり項目ですが、次のサンプルコードで確認することができます。個人的にはsubplotでよく描いていたような配置にすることができました。
clear;
[x1,y1,z1] = peaks;
figure
tiledlayout(3,2)
nexttile(1,[1 2])
contourf(x1,y1,z1)
nexttile(4,[2 1])
contourf(x1,y1,z1)

コード内容と配置の比較
先ほどのサンプルコードについて、コード内容とFigureの配置を比較しました。赤・緑・青、それぞれの色で対応させています。主に次のような考え方で記載しました。複数の分割箇所を結合できて、結合によっても分割位置の番号は変化しないことを確認しました。
- “tiledlayout” 赤枠の箇所で全体の行列サイズを決定する
- “nexttile” の最初の青枠で開始地点を指定する
- 開始地点から見たサイズを緑で指定する

おわりに
subplotからtiledlayoutに移行するために「できるだけ今まで通りの考え方で使えないか」をコンセプトに使い方を調べました。結果として同じような感覚で使えることができるようになったかと思います。この記事では、tiledlayoutのメリットについては触れていませんが、subplotにはない多くのメリットがありますので、その辺りを上手に使いながら触っていければなと考えています。