モチベーション
MATLABで両側に異なるy軸をもったグラフをプロットするには、最新のバージョンではyyaxis、古いバージョンではplotyyを使うようです。
しかし、少なくともバージョンR2015bでのplotyy
では、図の大きさや、軸の値ラベルのフォントサイズを調整しようとすると、うまく表示できません。
例 :
xs = linspace(0, 100);
ys1 = xs.^2;
ys2 = 2 * xs + 50;
[hAx,hLine1,hLine2] = plotyy(xs, ys1, xs, ys2);
set(hAx(2), 'FontSize', 30);
任意の図の大きさ、フォントサイズでちゃんとプロットしたものすべてが収まるようにするにはどうしたらいいのか、というのが本記事の内容です。
どうするか
次のようにします
xs = linspace(0, 100);
ys1 = xs.^2;
ys2 = 2 * xs + 50;
ax1 = gca;
axesPosition = get(ax1,'Position'); % いまの座標軸の位置を取得
ax2 = axes('Position',axesPosition,... % 新たに座標軸を作成
'Color','none',...
'YLim',[0 400],...
'YAxisLocation','right',... % y軸は右側
'XTick',[],... % 新たな座標軸のx軸には何も表示しない
'Box','off');
h_1 = plot(ax1, xs, ys1); % 左側の座標軸にプロット
hold(ax2, 'on'); % 前のプロット上書きしないようにする
colorOrder = get(gca, 'ColorOrder'); % プロットの色を取得
h_2 = plot(ax2, xs, ys2, 'Color', colorOrder(mod(length(get(gca, 'Children')), size(colorOrder, 1))+2, :)); % 次の色で右側の座標軸にプロット
% 各軸のラベルを線の色と同じ色で追加
ylabel(ax1, 'Axis 1', 'Color',get(h_1, 'color'));
ylabel(ax2,'Axis 2','Color' ,get(h_2, 'color'));
% ラベルのフォントサイズを変更
set(ax1,'FontSize',30);
set(ax2,'FontSize',30);
%% ポイント %%
% まず、右側の座標軸のサイズをリサイズします。
% 第3引数の配列は、グラフの[左座標 下座標 横幅 縦幅]を表します。
% 今回は左右がはみ出てしまうことが問題だったので、左座標、横幅をそれぞれ適当な大きさ分小さくします。
set(ax2,'OuterPosition',[0.15 0 1-0.15 1]);
% 次に、左側の座標軸を右側の座標軸と一致するようにします。
% これで1つのサイズのグラフの中にふたつの座標軸ができます。
ax1.Position = ax2.Position;
補足と参考資料
MATLABの描画については、FigureとAxis、Position、OuterPositionという用語を理解しておくとよいです。Figureは描画ウィンドウ全体、Axisはプロットする座標系、PositionはAxisの座標軸の中、OuterPositionはAxisの軸ラベルやタイトルも含めた領域を指します(参考)。
上のコードでは、ふたつのAxisのOuterPositionのサイズをFigureのなかに収まるようにリサイズしています。これは主にこのstackoverflowの質問を参考にしました。この質問の回答者によると、plotyy
は思った通りに動かないので使わないほうがよさそうです。