2021年7月25日

Relationを使ったSankey Diagramに余白をつける

最終更新: 2023年2月12日

最終更新:
 
2023/02/12
 

 
ダウンロード用Workbook:
 
https://tabsoft.co/3uwGPAl

こちら記事の続きです。

未読の方は目を通して頂いた方が、今回の記事は分かりやすいと思います。

前回は2020.2からの機能: Relationを使用した、簡単なSankey Diagramの作成方法(本質的には元データに不必要に影響しないData Densificationの方法)を解説しました。

今回の記事では、前回作成したSankey Diagramに余白をつける方法について解説します。


余白の作り方の概要

まずは元となるVizを見ていきます。今回は3つ以上のディメンション使用時のSankey Diagramに応用させるため、3つのディメンションを使用します。

要は3つ以上のディメンションからなるクロス集計表を、Sankey Diagramの形で可視化するような応用です。

(ちなみに今回はRegion、Category、Segmentを使用します)

復習になりますが、この方法でのSankey Diagramは上端同士を結んだ曲線、下端同士を結んだ曲線を繋げてポリゴンを描画しています。

(その上端/下端を与える計算式がPosition MAX/MIN)

したがってポリゴン間に余白を作りたいのであれば、上端と下端を余白分だけ垂直移動させ、移動後の上端/下端同士を結んだポリゴンを描画する計算式を作ればいいことになります。

そして余白の付け方ですが、今回は下図のように、各Dim毎に余白をつけるものとします。

ひとつのDim 1に注目すると、下図のように上端/下端を移動させるイメージです。

以下、計算式と作成例を見ていきましょう。


余白を入れてSankey Diagramを作る

以下、Dim 1 - Dim 2間のSankey Diagramを例に見ていきます。

まず各ディメンションの各値につける余白を、以下の式で作成します。

ここで[Margin]は小数型パラメータです(以下0.3としています)。

Margin 1
 
IFNULL((INDEX() - 1)/(SIZE() - 1), 1) * [Margin]

Margin 2
 
IFNULL((INDEX() - 1)/(SIZE() - 1), 1) * [Margin]

計算式のポイントは以下です。

  • INDEX() - 1でディメンションの通し番号を取得。
     
    ただし一番最初のディメンション値には余白をつけたくないので マイナス1しています。

  • SIZE()でディメンション内の値のユニークカウントを取得します。
     
    例えばRegionディメンションは4つの地域を値として持つので、SIZE()で取得したい値は4となります。

  • そしてIFNULL()を使い、フィルター等でディメンション内に単一の値のみ含まれる場合にNULLとならないように補正します。
     
    (SIZE() - 1 = 0となるため(INDEX() - 1)/(SIZE() - 1)がNULLとなる)

Margin 1とMargin 2は同じ計算式ですが、表計算設定で値の取り方をそれぞれのディメンションに合わせた形にします。

後ほど表計算設定画面を掲載しますが、イメージとしては以下のように、Margin 1はDim1に、Margin 2はDim 2に対応して固有の値を取らせるイメージです。

このMargin 1、Margin 2を使用し、それぞれの上端/下端を以下の計算式で作成します。

Position 1 MAX (Margin)
 
RUNNING_SUM([Sankey Arm Size]) + [Margin 1]

Position 1 MIN (Margin)
 
[Position 1 MAX (Margin)] - [Sankey Arm Size]

Position 2 MAX (Margin)
 
RUNNING_SUM([Sankey Arm Size]) + [Margin 2]

Position 2 MIN (Margin)
 
[Position 2 MAX (Margin)] - [Sankey Arm Size]

余白なし版との違いは、Position MAXにMargin項を足しただけですね。

これで上端と下端が出来たので、ポリゴンを描く計算式も作成します。

Curve Polygon 1-2 (Margin)
 
CASE MIN([Min/Max])
 
WHEN 'Min' THEN [Position 1 MIN (Margin)] + ([Position 2 MIN (Margin)] - [Position 1 MIN (Margin)]) * MIN([Curve Function])
 
ELSE [Position 1 MAX (Margin)] + ([Position 2 MAX (Margin)] - [Position 1 MAX (Margin)]) * MIN([Curve Function])
 
END

ということで必要な計算式は揃ったので、実際に余白付きSankey Diagramを作ってみましょう。

表計算設定の細かいところは解説すると長くなりますが「何で計算させるか」だけ意識いただければ大丈夫かなと思います。

ちなみにDim 2 - Dim 3間のSankey Diagramも同様に作成できますので、こちらはWorkbookを確認ください。


ラベルを作る

さて、余白付きSankey Diagramは作成できましたが、これだけでは可読性があまり高くありません。

ということで、各ディメンションが何かを示すためのラベルを追加します。

以下、3種類の作成パターンを紹介します。ご自身のデータに合いそうなものをお使いください。


パターン1:ポリゴン幅に合わせたラベル①

一番簡単なものからいきましょう。Gantt Chartで作成します。

下図のように、Dim 1を使用し、Position 1 MINを行に、サイズにSankey Arm Sizeを使用して作成します。

表計算は全てDim 1を使用して実行します。

Dim2, Dim3も同様に作成すると、以下の形になります。


パターン2:ポリゴン幅に合わせたラベル②

次にラベルの可読性を上げるため、ラベルを水平向きにしたものを作成します。

Gantt Chartのままラベルを水平向きにしても良いのですが、その場合ラベルは基本的にGantt内に作られるので、Ganttの外に出しつつ作成する方法を紹介します。

以下の計算式を作成します(Dim2, Dim3用のものについても同様)。

Dot 1 (Margin)
 
[Position 1 MIN (Margin)] + [Sankey Arm Size]/2

この計算式を以下のように、二重軸で配置します。

列に適当な小数(MIN(1.0)など)を入れておけば位置調整がしやすいです。

この方法でそれぞれのラベルを作成したものが以下です。

中央のデザインがいまいちなので、少し手間かけて見やすくしたものを、参考までに以下に載せておきます。

見栄えだけの話なので、詳細はWorkbookを確認ください。


パターン3:ラベルだけのもの

最後に、ディメンション内の値が多く、細かいポリゴンが多く出来る場合のために、簡単にラベルだけ表示する場合を載せておきます。

(Web解析でユーザーのページフロー分析などする際に、どうしても細かくなりますよね)

作り方は簡単で、以下のようにそれぞれ配置します。

ラベルの位置を合わせやすいので、円マークまたは四角マークがオススメです。

ポイントとしては、Dotの計算フィールドだけでは軸範囲が0~1+[Margin]よりも小さくなってしまうので、それを防ぐために隠れリファレンスラインを設定します。

(上図での値1.3のリファレンスラインです)

また色の不透明度を0にし、サイズを最小にしマークが目立たないようにします。

ヘッダー等も非表示にし、下図のようになっていればOKです。


最後に

ということで、Relationを使用したSankey Diagramに余白をつける方法について取り上げました。

Self-unionで作ったときよりも計算式が簡単になるので、やっぱりこの方法が良いですね。

見やすさが向上するので、ぜひチャレンジしてみて下さい。

質問などありましたらTwitterかLinkedinでお願いします。それでは。