地図上に棒グラフを表示する(どうしてもやりたい人向け)

2023.12.30 tableau
ホームブログ

地図上に棒グラフを表示する(ど...

メールで頂いたご質問で「地図上に棒グラフを表示したい」というものがありました。ちょうど下図のようなイメージですね。

残念ながら、Tableauの基本機能としてこれはサポートされていません。おそらく棒グラフが他の境界(国や地域)を突き抜けて見にくくなることを避けるためにワザとサポートしていないのではないかと勝手に推測しています。例えば、この図でもしもサウスカロライナ州が突出した成績を出していたら、ノースカロライナ州のグラフは見えなくなってしまいますからね。

が、しかし! ちょっとマニアックな方法を使うと実現することができます。最大のポイントは「棒グラフを棒ではなく4点座標を使った長方形で表現する」というところです。細かく説明するとかなり長くなるので、ある程度TableauDesktopを触ったことがある前提で端折りながら解説します。

「座標の長方形で表現」というところでピンときた方もいると思いますが、最終的な設定上のグラフタイプは「棒」ではなく「多角形」になります。手順としては

1. すべてのレコードを4行に増やしてポイントオーダー1番~4番まで割り当てる
2. 棒グラフの本数を求める
3. 1番~4番のレコードの経度に対し、計算フィールドで棒グラフの幅を加減算する
4. 2番と3番のレコードの緯度に対し、計算フィールドで表示したいメジャー(売上とか)を加算する
5. 計算した緯度経度をプロットし、ポリゴン(国とか州とか)で分解してからポイントオーダーでパスをつなげる

といった感じです。どのレベルのデータ更新まで耐え得るようにするかによりますが、2番目の手順でLODを使うことになるので、データソースは単一にしておきましょう。ここでは棒グラフを縦に伸ばしていきますが、横に伸ばしたい場合は緯度と経度を入れ替えればOKです。

<手順1>
最も重要なステップです。初めて見る人にとっては「すべてのレコードを4行に増やしてポイントオーダーを1番~4番まで割り当てる」が意味不明だと思うので、実現しようとしていることとその過程の理屈を解説します。Tableauでは標準で棒グラフを作成する機能がありますが、マップ上ではなかなかに扱いにくい(というか使えない)です。それは棒グラフの起点となる軸が各ポリゴンごとにバラバラになるからです。標準の棒グラフを諦めるとしても、見た目としての棒グラフは「基準となる点から伸びる長方形」と言い換えることができ、また長方形は「4点を線分で囲んだ領域」でもあります。これをTableau的に解釈すると「各ポリゴンの中心点を基準に、縦にメジャー分の長さを持つ4点をプロットして線でつなげる」ということになり、人間の目で見れば棒グラフのような表現になります。言葉だと分かりにくいので図解にすると次のような感じです。


Tableauのマップは基本的に座標によって表現されます。すなわち、「各ポリゴンの中心点」は「ポリゴンを構成する境界座標の平均値」と言うことができ、また「縦にメジャー分の長さを持つ」は「中心点からメジャー分だけ緯度が移動する」と言うことができます。

つまり、ひとつのポリゴン(領域)に1本の棒グラフらしきものを見せるには4つの点が必要です。更に点をつなぐには順番がありますので、1番から4番を数値で割り当てるようにします。表示したい棒グラフが複数本ある場合は、1本につき4点を用意します。この例だと年ごとの棒グラフで推移を見せているので、データのある年数分だけ4つの点を用意します。わざわざ点の数だけレコードを用意するのは面倒なので、今回は別シートでCROSS JOINできる表を作ってデータソースを組む段階で結合しています。

<州ごとの座標>

< CROSS JOINで点を増やすためのシート>

<表示したいメジャー>

<データソースのプレビュー>

プレビューを見て分かる通り、ひとつの州のひとつの年に4つのポイントオーダーができています。ありがちですが、単純にレコード数が4倍になっているので、メジャーを扱うときは注意が必要です。

<手順2>
この手順は必須というわけではないのですが、そこそこ綺麗に見せようと思うならやったほうがいいです。ここで実現するのは「並んだ棒グラフ全体の中心がポリゴンの中心とほぼ同じになるようにする」というだけです。上図の基準点から単純に経度プラスで棒グラフをずらしていくと、棒グラフの全体像がポリゴンの中心点から右にずれてしまいますので、その調整です。今回はグラフの本数の平均(グラフ全体のど真ん中)を基準点にして、その偏差で経度をプラスマイナスすることで、ポリゴンの中心点と棒グラフ全体の横方向の中央がなるべく重なるように計算しています。

LODの中にLODをネスト(入れ子)し、集計値としてではなく非集計値としてフィールドを追加します。集計と非集計の混在エラーを避けるための措置ですね。

<手順3>
経度はメジャーに関係ありませんが、棒グラフの幅に影響します。ポイントオーダー1番と2番は同じ、3番と4番は設定したい幅を加算します。実際にVIZを出してみないとその幅が適切か分かりませんので、パラメータで事後的に制御できるようにしておくと便利です。

こうして計算した4点の経度に対して、手順2で求めた年平均と各データの年の偏差にグラフの幅を乗じた値を加算すると、年ごとに棒グラフを横に並べることができます。下図で0.05を足しているのは、年ごとのグラフがはっきり見えるように調整しているだけなので、足さなくても構いません。

<手順4>
次は緯度ですが、これは簡単です。ポイントオーダー2番と3番の緯度にメジャーを加算するだけです。但し、そのままメジャーを加算してしまうと棒グラフが地球を突き抜けてしまうので、これもパラメータで制御できるようにしておきます。

<手順5>
ここまで来れば、あとはフィールドを配置するだけになります。グラフタイプを多角形にするとマークにパスアイコンが表示されますので、ポイントオーダーはパスに入れます。

グラフが異様に長かったり幅が狭すぎたりするので、パラメータで見た目を調整します。このあたりは手作業でいい感じのところに落ち着く値を探すことになります。自動化もできなくはないですが、労力に見合わない気がしていますので今回はカット。

以上のような手順でマップのポリゴン上に棒グラフ(っぽいもの)を並べて表示することができます。ただ、これだとメジャーの軸がないので絶対値が分かりづらい状態です。冒頭の画像のように、Viz in Tooltipを利用して値を表示できるようにしたほうが、見る人にとっては親切かもしれません。

荒業ではありましたが、必要な知識は算数の知識だけです。やっぱり基礎教育って大事。ちなみに同じ要領で少し応用すると、不可能とされている複合グラフを表示することもできます。いずれにしても手間がかかることに変わりはありませんので、「どうしてもこの形にでなければならない」という場面でだけ使うようにしましょう。