LoginSignup
2
1

More than 5 years have passed since last update.

MATLABで2つy軸があるグラフの画像をちゃんと保存するには

Posted at

モチベーション

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);

スクリーンショット 2017-02-09 0.59.59.jpg

任意の図の大きさ、フォントサイズでちゃんとプロットしたものすべてが収まるようにするにはどうしたらいいのか、というのが本記事の内容です。

どうするか

次のようにします

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;

スクリーンショット 2017-02-09 1.31.20.jpg

補足と参考資料

MATLABの描画については、FigureとAxis、Position、OuterPositionという用語を理解しておくとよいです。Figureは描画ウィンドウ全体、Axisはプロットする座標系、PositionはAxisの座標軸の中、OuterPositionはAxisの軸ラベルやタイトルも含めた領域を指します(参考)。

上のコードでは、ふたつのAxisのOuterPositionのサイズをFigureのなかに収まるようにリサイズしています。これは主にこのstackoverflowの質問を参考にしました。この質問の回答者によると、plotyyは思った通りに動かないので使わないほうがよさそうです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1