【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点です。

  1. 要因バーの底辺の位置は,bar関数のプロパティ BaseValue で設定する。
  2. バー1つ1つに直行座標軸 ax(i) を設定する。そのままだと最後に描いたバーしか見えないので,背景色 Colornone に設定する。
  3. バーの色は 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