subplot | MATLAB関数2

MATLAB関数では、MATLABでよく使う関数について便利な使い方とともに紹介しています。前回はinterp1について紹介しました。今回はsubplotについて説明します。plot関数についての使い方はこちらで解説していますので併せてご参照ください。

subplot関数は複数のグラフを1つのfigureに表示することが可能です。用途はいくつかありますが解析などでよく使用する縦にグラフを並べて表示する方法について説明します。

目標の確認

今回作成するfigureを確認しておきます。下の図のように複数のグラフを1つのfigureに表示します。また上下、左右で軸が連動するように設定します。

簡単なsubplotの使い方

まずはもっとも簡単なsubplotの使い方について説明します。初めにグラフを作成するためのデータを生成します。グラフの作成で説明に使用したデータを生成します。

MATLAB
x = 0:pi/20:2*pi;
y1 = sin(x);
y2 = sin(2*x);

縦にグラフを並べるため、共通の横軸をもつデータを作成しています。つづいてsubplot関数を用いてy1とy2が縦に並ぶグラフを作成する下記コードを追加します。

MATLAB
subplot(2,1,1)
plot(x,y1)

subplot(2,1,2)
plot(x,y2)

実行すると下記のようにたてに並んだy1=sin(x)とy2=sin(2x)のグラフが生成できました。

figure 簡単なsubplotの使い方

subplot使い方の説明

上記の例について説明します。1行目のsubplot(2,1,1)の最初の2つの引数でfigureを2行1列に分割していることを示します。そして3つ目の引数の「1」で2行1列の行列の1番目の領域にグラフを生成すること意味します。

つまり、Figureを上下に2分割し上の領域にplotをするという意味になります。実際2行目で記述したplot(x,y1)はFigureの上の領域に描画されています。

同様に4行目のsubplot(2,1,2)は上下に分割した下の領域にグラフを描画することを示します。

結果的にy1=sin(x)とy2=sin(2x)のグラフを上下に並べることができます。

左右に分割する

続いてグラフを上下・左右に分割する方法について説明します。1~5行目でplotするデータを生成します。先ほどはFigureを上下に分割するため、2行1列に領域を分けましたが今回はさらに左右に分割するため2行2列に分割します。そのため、7,10,13,16行目はsubplot(2,2,*)という形式になっています。

MATLAB
x = 0:pi/20:2*pi;
y1 = sin(x);
y2 = sin(2*x);
y3 = sin(3*x);
y4 = sin(4*x);

subplot(2,2,1)
plot(x,y1)

subplot(2,2,2)
plot(x,y2)

subplot(2,2,3)
plot(x,y3)

subplot(2,2,4)
plot(x,y4)

上のコードの実行結果は下記図のようになります。図からもわかるように左上、右上、左下、右下の順にグラフが描画されています。描画される領域の順序に気をつけましょう。

figure subplot左右に分割

subplotで複数領域に描画する

続いては複数領域にplotする方法です。早速ですが、下記コードを実行します。

MATLAB
x = 0:pi/20:2*pi;
y1 = sin(x);
y2 = sin(2*x);
y3 = sin(3*x);

subplot(2,2,[1 2])
plot(x,y1)

subplot(2,2,3)
plot(x,y2)

subplot(2,2,4)
plot(x,y3)
figure subplot複数領域に描画1

6行目のsubplot(2,2,[1 2])のように第3引数に[1 2]と記述することで2行2列に分割した領域の1,2領域に描画することが可能なため、上の図のようなグラフが作成できます。

縦長の領域を使用する場合、下記のように6,9行目を変更することでplot(x,y1)を2行2列の1,3領域にグラフを生成できます。

MATLAB
x = 0:pi/20:2*pi;
y1 = sin(x);
y2 = sin(2*x);
y3 = sin(3*x);

subplot(2,2,[1 3])
plot(x,y1)

subplot(2,2,2)
plot(x,y2)

subplot(2,2,4)
plot(x,y3)
figure subplot複数領域に描画2

linkaxesで動きをリンクさせる

複数領域への描画方法を説明しましたが、実用上はグラフを縦に並べることがよくあります。特に時系列データを扱う場合、横軸に共通の時間軸を設定してグラフを並べることが多いです。しかし、「もっとも簡単なsubplotの使い方」で説明した方法では不便さを感じることがあります。

MATLAB
x = 0:pi/20:2*pi;
y1 = sin(x);
y2 = sin(2*x);

subplot(2,1,1)
plot(x,y1)

subplot(2,1,2)
plot(x,y2)

上記コードで作成したグラフは下図になります。

figure subplot上下

普通に使用する場合では特に問題ありませんが、データ解析の際には横軸方向にグラフを拡大することがよくあります。例えば、下のグラフのxが3~4の範囲を確認したい場合、下記のようにxlimで範囲を指定します。

MATLAB
x = 0:pi/20:2*pi;
y1 = sin(x);
y2 = sin(2*x);

subplot(2,1,1)
plot(x,y1)

subplot(2,1,2)
plot(x,y2)
xlim([3 4])

意図通り、下のグラフはxが3~4の範囲で描画されましたが、上のグラフとx軸の範囲が異なってしまっています。

figure sublot上下でx軸の範囲が異なる

また、figureの「ズームイン」や「移動」の機能を使用した場合もx軸が連動せず見辛いです。下記のようにコードを変更します。

MATLAB
x = 0:pi/20:2*pi;
y1 = sin(x);
y2 = sin(2*x);

figure(1)
ax(1) = subplot(2,1,1);
plot(x,y1)

ax(2) = subplot(2,1,2);
plot(x,y2)
xlim([3 4])

linkaxes(ax,'x')
figure linkaxesでx軸を連動

subplot(2,1,1)とsubplot(2,1,2)をそれぞれaxという変数に格納し、13行目で軸を連動させるために、linkaxesという関数を使用して、axのx軸が連動するように指定しました。figureの右上にカーソルを合わせると下図のような拡大・縮小/移動などの操作が実施できますが、上下のグラフでx軸が常にリンクしていることが確認できます。

figureの操作(拡大、縮小、移動)

上下左右でリンクしたfigureの作成

上記で学んだ内容を生かして、最終目標の確認を行います。

MATLAB
x = 0:pi/20:2*pi;
y1 = sin(x);
y2 = sin(2*x);
y3 = 1.2*sin(x);

figure(1)
ax(1) = subplot(3,3,[1 2 4 5]);
plot(x,y1)

ax(2) = subplot(3,3,[7 8]);
plot(x,y2)

ax(3) = subplot(3,3,[3 6]);
plot(x,y3)

linkaxes([ax(1) ax(2)],'x');
linkaxes([ax(1) ax(3)],'y');

figureの中に3つのplotを作成します。ax(1) = subplot(3,3,[1 2 4 5]);で3×3行の領域の左上2×2にメインのグラフの領域を作成。

ax(2) = subplot(3,3,[7 8]);で先ほどのグラフの下に、ax(3) = subplot(3,3,[3 6]);でメインのグラフの右側にグラフを作成。

16行目のlinkaxesで1つ目と2つ目のグラフのx軸をリンク。

また、17行目で1つ目と3つ目のグラフのy軸をリンク。

結果的に出来上がるグラフが下記になります。「移動」をクリックしてグラフを動かすと最初にお見せした動きを確認することができます。

まとめ

今回はsubplotについて説明しました。複数のグラフを同時に確認する場合に1つのFigureで表示できるため、とても便利で実務上も頻繁に使用します。時系列のデータ解析などでは縦にグラフを並べて確認することが一般的なので、x軸を連動させるlinkaxesについても紹介しました。

subplotは使う場面が非常に多いですが、毎回0からコードを書くのは面倒なのでコードの使いまわしすると便利です。

下記に本日作成したコードを載せておきますので、適宜コピペしていただき、plotの部分だけ書き換えてご使用ください。

MATLAB
x = 0:pi/20:2*pi;
y1 = sin(x);
y2 = sin(2*x);
y3 = 1.2*sin(x);

figure(1)
ax(1) = subplot(3,3,[1 2 4 5]);
plot(x,y1)

ax(2) = subplot(3,3,[7 8]);
plot(x,y2)

ax(3) = subplot(3,3,[3 6]);
plot(x,y3)

linkaxes([ax(1) ax(2)],'x');
linkaxes([ax(1) ax(3)],'y');

関連記事

コメント

この記事へのコメントはありません。