2024/5/30 追記
こちらの記事の内容に関連して、Workout Wednesdayという活動に問題を寄稿しました。
ご興味あればぜひご覧ください。
https://workout-wednesday.com/2024w22tab/
今回のテーマは「2つのワークシートのスクロールバーを同期させよう」です。
僕のTwitterに流れてきた以下のツイートの学習ノートです。
この記事のワークブックは以下でダウンロード可能です。
単なる和訳ではなく、僕の勉強ノートなので、必ずしも引用元のブログに則って書いていません。あしからず。
【始める前に:「Tableauの操作の順序」について】
今回の記事では「表計算フィルター(といってもINDEX()でフィルターするだけ)」を使います。といってもTableauのフィルターの種類、どのタイミングでフィルターがかかるか、という話だけで記事一本書けてしまうので、今日は軽い紹介にとどめます。
まず、以下に「Tableauの操作の順序」の図を示します。
抽出フィルター、データソースフィルター・・・という順番で、Tableauでは「何をするか」が行われていきます。そして「RUNNING_SUM()とかTOTAL()とかの表計算ってどのタイミングで行われるんだ」というと、実は下から2番目なんですね。つまりほぼ最後です。
言い換えると、表計算は殆どすべてのフィルタリングや集計計算が終わってから実施されます。表計算が集計関数を要することを考えると、当たり前といえば当たり前かもしれません。
ここで念頭においてほしいのは「表計算をフィルターに入れることによって計算に与える影響は、ほとんどない」「表計算フィルターはMeasure, Dimensionのフィルタリングよりも『何を表示させるか』をフィルターする場合に使える」ということです。
逆に、普段よく使うフィルター(厳密にはDimension FilterとかMeasure Filter)は、バリバリ計算に影響与えてますよね。なぜなら使うデータがフィルターされることにより、計算結果が異なるので。
ちなみに上記のフロー図、知っておくとTableauが100倍捗る気がします。
【本題:スクロールバー同期の方法】
まず、今回作るVizは下記のような、表を想定します。
(Klausも言ってますが、明らかにVizのベストプラクティスではないです。例ということで一つ)
Stateを行に、YearとQuarterを列にした、49×(4年×4半期=16)の表です。
それぞれSales, Profitに関する表です。これをダッシュボードに入れると、それぞれがスクロールバーを縦横に持ってしまうので、使いにくいですよね。
これを解決するために、以下の計算式を作成します。
INDEX Columns
INDEX()
INDEX Rows
INDEX()
これをそれぞれ不連続にし、表に追加します。
ここで、この表は行方向にはStateがずらーっと、列方向にはYEARとQUARTERが並びます。
INDEX RowsとINDEX Columnsをそれぞれに対応させたいので、前者はStateを使って、後者はYEARとQUARTERを使わせます。
(より直感的には前者はTable(down)を、後者はTable(across)を使います。)
次に、RowsとColumnsそれぞれにパラメーターを作成します。
ここで少しネタバレをすると、先ほど作成したINDEXを用いて「ワークシートに表示させるINDEXを制限する(フィルター)することにより、疑似的にスクロールさせているように見せる」ことが、今回のゴールです。
何が言いたいかというと、INDEX RowsはStateの項目数=49が最大値、INDEX Columnsは16が最大値です。
したがって、パラメータの最大値をそれ以下に設定するべきだ、ということです。
(上の話は、このVizを作り終えたときにもっとわかりやすいので、適当に飛ばしても大丈夫です)
最後に、作成したパラメーターとINDEX Rows/Columnsで計算式を作成します。
Filter Rows
[Scroll-Controll up & down] <= [INDEX Rows]
Filter Columns
[Scroll-Controll left & right] <= [INDEX Columns]
それぞれをワークシートに追加します。
それぞれのフィルターが何をしているか、軽く解説します。
例えば行方向では「INDEX Rowsが行方向パラメータ ([Scroll-Controll up & down]) よりも大きいもの」だけを表示する、という形のフィルターをしています。したがって、例えば[Scroll-Controll up & down]=10ならば、INDEX Rowsが1~9のものは表示されない、といった具合です。
これはColumns方向にも同じことなので、実際にはこれは「スクロールバーの同期」ではなくて「表示する最小INDEXをフィルタリングしている」→「ワークシートがスクロールしているように”見える”」ということですね。
このあたりは、実際にワークブックをダウンロード→遊んでみると、よく体感して頂けると思います。
【おまけ:今回のネタの使い方】
最後に、これどういう時に使えそうか、みたいなことを考えました。こういう使い方はどうでしょうか。
・表示したいVizのディメンジョン内項目数が多いので「ビュー全体」にすると情報過多になる
・縦軸を持った棒グラフ、折れ線グラフを使いたい→可視性のために縦方向にスペース広めにほしい
・Vizが複数あるので、そもそも複数個スクロールバーがあると使いにくい
みたいなニーズがあるときに、いいんだろうなと思いました。(単なる感想でごめんなさい)