【MATLAB】Waterfall図の作成
概要
2つの数字の差異を可視化するときによく使われるWaterfall図。
Excelでも2016からデフォルト機能で描けるようになりました(下図)。
MATLABでもデフォルトで描ければ業務自動化が捗るのになと思っていたら,
関数を公開してくださっている方を発見しまして(参考文献[1]),参考にさせていただきつつ自分好みの見栄えにしました。
本文
関数の呼び出し
こんな感じで数字とラベルを投げると,
y=[10, 2, -3, -3, 5]; % 基点の値,要因A/B/C/Dによる変動,終点の値は省略
xlabel={'基点','要因A','要因B','要因C','要因D','終点'};
wfall(y,xlabel);
こんな感じでグラフを表示してくれる関数 wfall
を作成しました。
関数 wfall
ポイントは3点です。
- 要因バーの底辺の位置は,bar関数のプロパティ
BaseValue
で設定する。 - バー1つ1つに直行座標軸
ax(i)
を設定する。そのままだと最後に描いたバーしか見えないので,背景色Color
をnone
に設定する。 - バーの色は
Colormap
&CLim
で設定する。CLim
の0=基点と終点=藍色,1=増加=緑,-1=減少=赤色とする。
function [] = wfall(y,xlabel)
%% 準備
n = length(y);
cumy = cumsum(y); % 累積和
c = sign(y); % 符号判定(バーの色に使う)
% 座標軸をn+1個作成
ax = gca;
for i = 2:n+1
ax(i) = copyobj(ax(1), ax(1).Parent);
end
%% グラフ描画
h = bar(ax(1), 1, cumy(1), 'CData', 0, 'BaseValue', 0);
hold on
for i = 2:n
h(i) = bar(ax(i), i, cumy(i), 'CData', c(i), 'BaseValue', cumy(i-1), 'ShowBaseLine', 'off'); % 要因バーの底辺をBaseValueで設定(ポイント①)
end
h(n+1) = bar(ax(n+1), n+1, cumy(n), 'CData', 0, 'BaseValue', 0);
hold off
%% グラフの見栄え設定
% 縦横サイズ
set(ax, 'XLim', [0, n+1]+0.5, 'YLim', [min(min(cumy), 0), max(max(cumy), 0)]);
% すべてのバーが見えるようにする(ポイント②)
set(ax(2:end), 'Color', 'none');
% 横軸縦軸の設定
for i = 1:n+1
set(ax(i),'XTickLabels',xlabel(i));
end
set(ax(2:end), 'YColor', 'none');
% バーの色設定(ポイント③)
clmap = [...
255,0,0;... % 赤 - colorcodeは-1
0,51,153;... % 紺
0,128,0]; % 緑
set(ax, 'CLim', [-1, 1], 'ColorMap', clmap/255);
% CDataプロパティの適用
set(h, 'FaceColor', 'flat')
% グリッド設定
set(ax,'XGrid','off');
set(ax,'GridLineStyle',':');
set(ax,'GridAlpha',0.1);
set(ax,'Layer','top');
end
参考文献
以下のサイトを参考にさせていただきました。
[1] stack overflow > Consulting waterfall chart matlab > Answer Method 1
https://stackoverflow.com/questions/60685448/consulting-waterfall-chart-matlab
[2] MathWorks > ヘルプセンター > bar
https://jp.mathworks.com/help/matlab/ref/bar.html
Author And Source
この問題について(【MATLAB】Waterfall図の作成), 我々は、より多くの情報をここで見つけました https://qiita.com/moko_middo/items/5efd5aff130f7f75c68e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .