見出し画像

【Tableau】エリアチャートの見栄えUP!(with 円グラフ)

はじめに

前回の記事で標準のエリアチャートについて
以下の点が気になりました。

(エリアチャートに)カーソルを当てて各データを見るときに、
どこにカーソルを当てるべきかわかりにくい

https://note.com/miki_y1096/n/n8fbb2dbfdf2b

もしVizを見るユーザから
この点を改善してほしいと要望をもらったとき、
どのように設定すればよいでしょうか?

エリアチャートのデータは
黒い円で表示されているので、
円グラフを重ねて表示してみたいと思います。

エリアチャートに円グラフを重ねるときの注意点

試しに以下の数式(または表計算の累計)を使いつつ、
「二重軸」を使用して円グラフをエリアチャートに重ねてみました。
※エリアチャートが積み重ねられた状態は
カテゴリなど分類ごとの数値を累計し表示しているように見えるので、
累計を使ってみました。

RUNNING_SUM(SUM[売上]) /*下記のキャプチャの「合計(売上) △」のピル*/

ところが円グラフがエリアチャートのデータに重ならず、
大変苦労しました。

どうやら、エリアチャートの集計と
RUNNING_SUMによる集計は異なるようです。

エリアチャート with 円グラフ 失敗版


累計の設定


エリアチャートと累計の計算方法の違い

今回の場合、RUNNING_SUMだと
家具の値が一番下の円(上記のエリアチャートの青色の円)で
プロットされ、次に家電の値と家具の値の和が
真ん中の円(上記のエリアチャートの黄色の円)で
プロットされるようになっていました。

つまり、RUNNING_SUMの場合、カテゴリの一番上から順に加算しており、
一方、エリアチャートの場合はカテゴリの一番下から順に加算していく
ようになっています。
この点を考慮したうえで、Vizの設定を以下のように設定しました。

サンプルViz

今回2つの計算フィールドを作成しました。

①カテゴリ別エリアチャート用にフリップした売上累計
エリアチャートの各データ(黒い点)に円グラフが重なるように
以下の数式を設定しました。(計算フィールド名:「フリップした累計」)

/*
エリアチャートの一番下のカテゴリの売上
+真ん中のカテゴリの売上
+一番上のカテゴリの売上(数式を簡単にするべく、LOOKUPではなくRUNNING_SUMを使用。)
*/
IF INDEX()=1 
THEN LOOKUP(RUNNING_SUM(SUM([売上])),LAST()) 

/*エリアチャートの一番下のカテゴリの売上+真ん中のカテゴリの売上*/
ELSEIF INDEX()=2 
THEN LOOKUP(SUM([売上]),LAST()-1) + LOOKUP(SUM([売上]),LAST()) 

/*エリアチャートの一番下のカテゴリの売上*/
ELSEIF INDEX()=3 
THEN LOOKUP(SUM([売上]),LAST()) 

END

LOOKUP関数を使用すると、n行目の集計値を取得してくれます。

LOOKUP(集計値, n行目)

またLAST関数は最終行の行番号を取得してます。
今回の場合は各オーダー日の月の
最終行の行番号(3つのカテゴリごとに集計されているので「3」)を
取ってきています。

下のキャプチャでいうと、事務用品の「No.」列の数字(3)を
取得しています。

サンプルテーブル

また、最終行の前の行の行番号はLAST()-1で取得しています。
※LOOKUP関数で最初と最後の行以外の行番号を指定するときは、
なるべくLAST関数もしくはFIRST関数を使用するようにと
Tableauのヘルプに記載があります。

パーティション内の最初/最後の行に相対的なターゲットには、オフセット定義の一部として FIRST() + n と LAST() - n を使用してください。

https://help.tableau.com/current/pro/desktop/ja-jp/functions_functions_tablecalculation.htm


この計算フィールド(フリップした累計)に対する
「次を使用して計算」の設定は
「カテゴリ」にしています。


累計の設定

②エリアチャート用カテゴリ組み合わせ
①の各行の集計結果に対して、円グラフに
エリアチャートの各カテゴリの色を割り当てるために作成しました。

/*※この計算フィールドはViz上で凡例表示しない*/

IF INDEX() = 1 /*家具の色を割り当て。「事務用品+家電+家具」と表示される*/
THEN  LOOKUP(ATTR([カテゴリ]),LAST()) 
+ "+" + LOOKUP(ATTR([カテゴリ]),LAST()-1) 
+ "+" + LOOKUP(ATTR([カテゴリ]),LAST()-2) 

ELSEIF INDEX() = 2 /*家電の色を割り当て。「事務用品+家電」と表示される。*/
THEN LOOKUP(ATTR([カテゴリ]),LAST()) 
+ "+" + LOOKUP(ATTR([カテゴリ]),LAST()-1) 

ELSEIF INDEX() = 3 /*事務用品の色を割り当て。「事務用品」と表示される。*/
THEN LOOKUP(ATTR([カテゴリ]),LAST())
END

今回カテゴリが分かれて集計されているため、
ATTR関数を使用することで各カテゴリの値を取得できます。
(※ATTR関数がないと各カテゴリの値を取得できなかった気がしますが、
他の方法で設定できた方がいましたら是非教えてください!)

サンプルテーブル


エリアチャート with 円グラフ

最後に列に対してグリッド線を追加します。
これによって、オーダー日の月ごと区分けされ、
各月のカテゴリ別売上データを把握しやすくなります。

棒グラフによる疑似グリッドと比較して、
オーダー月と売上データに距離はありますが、
グリッド線と今回描画した円により、
この2つのデータの関係がより一目見てわかるようになります。

このVizを作成するときに感じたこと

今回の計算フィールドの注意点はカテゴリのように2~6つであれば、
数式を記載するときにまだ手間がかかりにくく設定しやすいと思います。

それ以上増えると誤った数式で数値のズレが発生しやすくなり、
正しく設定するのが大変だと思いました。

いかがでしょうか。
Tableauに触れて初めてエリアチャートに円グラフを重ねてみましたが、
RUNNING_SUMとエリアチャートの加算方法が異なることに気づいた
きっかけとなりました。
それでは!

皆さんのサポートに感謝です( ´∀` ) 引き続き記事投稿を通して、皆さんの一助になれたらと思います。