見出し画像

MATLABによるFigure作成

1.はじめに

MATLABはMathWorks社が開発する数値解析ソフトウェアおよびプログラミング言語である。これから、MATLABを使用して投稿論文あるいは学会発表スライドで使用するような図 (Figure) を作成する方法をまとめる。

2. シンプルなプロット

① データの用意

まず、プロットするためのデータを下記のように用意する。ここでは変数$${t}$$に対して振動しながら減衰する曲線$${S}$$を生成する。$${\tau}$$は緩和時間、$${\Omega}$$は周波数である。

t = 0:2:1000;
tau = 200;
Omega = .05;
S = exp(-t/tau).*cos(Omega*t);

② シンプルなデータプロット

下記のようなコードを実行することで横軸を$${t}$$、縦軸を$${S}$$としたFigureを作成することができる。

figure; box on;
plot(t, S);
シンプルなプロット

これでデータプロット自体は完了するが、投稿論文や学会発表スライドで使用することを想定するのであれば、曲線の見た目や軸ラベル等の体裁をもう少し整えたい。次節では、Figureの体裁を整える方法を説明する。

3. 体裁を整える

以下に、体裁の整えられたFigureを作成するコード、および実際に出力されるFigureを示す。Figureのデザインには好みがあるため、下記のコードはあくまでも一例である。

figure; box on;
plot(t, S, 'o', 'MarkerSize', 8, 'LineWidth', 1, ...
    'MarkerEdgeColor', [0, .3, .9], 'MarkerFaceColor', [.3, .7, .9]);

ax = gca;
ax.PlotBoxAspectRatio = [2, 1, 1];
ax.LineWidth = 1.2;
ax.TickLength = [.015, .015];
ax.FontSize = 11;
ax.FontName = 'Helvetica';
ax.XLim = [0, 1000];
ax.XTick = 0:200:1000;
ax.XLabel.String = '{\itt} (ps)';
ax.YLim = [-.8, 1];
ax.YTick = -.8:.4:1;
ax.YLabel.String = '{\itS} (arb. units)';
プロパティの設定で体裁を整えたFigure

線形2次元プロットを生成するコマンド”plot”の後ろに入力引数を与えることによってプロットされるマーカーの形状・色等を指定することができる。同様のことは下記のようなドット表記を使用して記述することもできる。

p1 = plot(t, S);
p1.Marker = 'o';
p1.LineStyle = 'none';
p1.MarkerSize = 8;
p1.LineWidth = 1;
p1.MarkerEdgeColor = [0, .3, .9];
p1.MarkerFaceColor = [.3, .7, .9];

次に軸(axes)のデザインに移る。まず、コマンド”ax = gca;”により現在のFigureの座標軸を取得する。この座標軸axの各プロパティをドット表記で記述していくことで軸のデザインを細かく設定することができる。

上記ではフォント名・フォントサイズや$${x, y}$$各軸の軸範囲・軸ラベル等の基本的なプロパティの設定を行った。より詳細なプロパティに関しては、公式のドキュメンテーションを参照するか、あるいはコマンドウィンドウに”ax”とだけ入力して実行すれば全プロパティを確認することができる。

4. 複数データのプロット

① データの用意

続いて、複数のデータを1つのFigureにプロットするようなケースを考える。プロットするデータとして周波数$${\Omega}$$を0.02から0.10まで変化させた曲線$${S}$$を生成する。

t = 0:2:1000;
tau = 200;
Omega = (.02:.02:.10)';
S = exp(-t/tau).*cos(Omega*t);

② 複数データのプロット

以下に、周波数$${\Omega}$$を0.02から0.10まで変化させた5本の曲線$${S}$$をプロットするコード、および出力されるFigureを示す。

r = linspace(1,0,size(S,1));
g = zeros(size(S,1),1);
b = linspace(0,1,size(S,1));
color = [r', g, b'];

figure; hold on; box on;
for ii=1:size(S,1)
    pp(ii) = plot(t, S(ii,:)-1.5*(ii-1), '-', 'Color', color(ii,:), 'LineWidth', 2);
    ll(ii)  = {['\Omega = ',num2str(Omega(ii),'%.2f')]};
end

ax = gca;
ax.PlotBoxAspectRatio = [2 3 1];
ax.LineWidth = 1.2;
ax.TickLength = [.015 .015];
ax.FontSize = 11;
ax.FontName = 'Helvetica';
ax.XLim = [0, 1000];
ax.XTick = 0:400:1000;
ax.XLabel.String = '{\itt} (ps)';
ax.YLim = [-7, 2.8];
ax.YTick = -6:2:2;
ax.YLabel.String = '{\itS} (arb. units)';

leg = legend(pp, ll, 'NumColumns',2);
leg.Location = 'northeast';
leg.FontName = 'Helivetica';
leg.FontSize = 11;
leg.Box = 'off';
複数データのプロット

今回は複数の曲線をプロットすることから、それぞれの曲線を判別しやすくするために曲線ごとで色を変化させることを考える。そのためにRGBの各成分を列に持つsize(S,1)×3の配列”color”を用意し、各曲線の色に割り当てる。今回のプロットでは赤から青へのグラデーションとなるようにした。

続いて、2次元配列$${S}$$を1列ずつオフセットをのせてプロットする。また、同時に凡例作成用のセル配列”ll”を用意している。凡例は上記のようにドット表記を使うとプロパティの細かな設定を行うことが可能になる。

また、下記のように記述することで、凡例の代わりに曲線付近にtextで周波数$${\Omega}$$を記載することもできる。

r = linspace(1,0,size(S,1));
g = zeros(size(S,1),1);
b = linspace(0,1,size(S,1));
color = [r', g, b'];

figure; hold on; box on;
for ii=1:size(S,1)
    plot(t, S(ii,:)-1.5*(ii-1), '-', 'Color', color(ii,:), 'LineWidth', 2);
    [~,idx] = min(abs(t-800));
    if ii==1
        text(t(idx)-120,S(ii,idx)-1.5*(ii-1)+.3,'\Omega = ',...
            'FontSize',11,'FontName','Helvetica','Color',color(ii,:));
    end
    text(t(idx),S(ii,idx)-1.5*(ii-1)+.3,num2str(Omega(ii),'%.2f'),...
            'FontSize',11,'FontName','Helvetica','Color',color(ii,:));
end

ax = gca;
ax.PlotBoxAspectRatio = [2 3 1];
ax.LineWidth = 1.2;
ax.TickLength = [.015 .015];
ax.FontSize = 11;
ax.FontName = 'Helvetica';
ax.XLim = [0, 1000];
ax.XTick = 0:400:1000;
ax.XLabel.String = '{\itt} (ps)';
ax.YLim = [-7, 1.1];
ax.YTick = -6:2:2;
ax.YLabel.String = '{\itS} (arb. units)';
複数データのプロット②

5. 複数Axesの作成 (subplot)

最後に、複数のプロットを複数のAxesに分けて出力する方法を示す。複数のAxesを作成する場合には”subplot”を使用する。

%% Data preparation
close all;

t = 0:2:1000;
tau = 200;
Omega = [.025; .05];
S = exp(-t/tau).*cos(Omega*t);

%% Plot

figure; hold on; box on;
subplot(2,1,1);
plot(t, S(1,:), 'o', 'MarkerSize', 6, ...
    'MarkerEdgeColor', [0, .3, .9], 'MarkerFaceColor', [.3, .8, .9], 'LineWidth', 1);
legend('data 1', 'Location','northeast','Box','off');
ax(1) = gca;
subplot(2,1,2);
plot(t, S(2,:), 'o', 'MarkerSize', 6, ...
    'MarkerEdgeColor', [.9, .3, 0], 'MarkerFaceColor', [.95, .7, .5], 'LineWidth', 1);
legend('data 2', 'Location','northeast','Box','off');
ax(2) = gca;

ax(1).PlotBoxAspectRatio = [2 1 1];
ax(1).LineWidth = 1.2;
ax(1).TickLength = [.015 .015];
ax(1).FontSize = 11;
ax(1).FontName = 'Helvetica';
ax(1).XLim = [0, 1000];
% ax(1).XTick = 0:200:1000;
% ax(1).XLabel.String = '{\itt} (ps)';
ax(1).XTickLabel = [];
ax(1).XLabel.String = '';
ax(1).YLim = [-.8 1];
ax(1).YTick = -.8:.4:1;
ax(1).YLabel.String = '{\itS} (arb. units)';

ax(2).PlotBoxAspectRatio = [2 1 1];
ax(2).LineWidth = 1.2;
ax(2).TickLength = [.015 .015];
ax(2).FontSize = 11;
ax(2).FontName = 'Helvetica';
ax(2).XLim = [0, 1000];
ax(2).XTick = 0:200:1000;
ax(2).XLabel.String = '{\itt} (ps)';
ax(2).YLim = [-.8 1];
ax(2).YTick = -.8:.4:1;
ax(2).YLabel.String = '{\itS} (arb. units)';
ax(2).Position = ax(1).Position;
ax(2).Position(2) = ax(2).Position(2)-.38;

annotation('textbox',[.3, .83, .1, .1],'String','(a)', ...
    'EdgeColor','none','FontName','Helvetica','FontSize',12);
annotation('textbox',[.3, .45, .1, .1],'String','(b)', ...
    'EdgeColor','none','FontName','Helvetica','FontSize',12);
複数Axesの作成 (subplot)

“subplot”を使用するときには、subplot(m,n,p)と記述することでm行n列のグリッドの中の位置pにデータをプロットすることができる。それぞれのsubplotにてax(p)=gca;で座標軸を取得すれば、後から座標軸ごとのプロパティを個別に設定することが可能になる。

最後にannotationとして(a), (b)の記載を追加した。

6. 参考リンク


この記事が気に入ったらサポートをしてみませんか?