見出し画像

tableauで地下鉄路線図を作成する

WOW2024W21の「Can you rebuild this tube map?(この地下鉄MAPを再現できるか?)」とかなり挑戦的なタイトルに興味をひかれたので、実際に出されていた地下鉄MAPの作成に挑戦してみた記録

要件は以下のとおり

  • ダッシュボードサイズは1000X800

  • すべての駅と支線を入れた路線図を地図上に作成

  • 出発する駅を選んだら、そこから行くことができる駅の中から目的の駅を選べるようにする(ヒント:パラメータと接続)

  • 選択した二つの駅の間の駅の数のカウント

  • 好きなようにデザインを変更

上記以外にもVizを見ると選択した駅の間の路線、駅がハイライト表示されているのでそれも実現したい。


1.データの準備と中身の確認

1-1.データの準備

まずはデータソースを準備。data.worldの下記リンクから.hyperファイルをとってくる
#WOW2024 W21 - dataset by missdataviz | data.world

1-2.データの中身を確認

中身はこんな感じ

TubeStations.hyper

各カラムとデータ型、おおよその意味はこんな感じ。
・Branch(文字列型):路線(Line)の支線毎の枝番号
・Line(文字列型):路線名
・Name(文字列型):駅の名前【Stationと何が違うのか・・・】
・Number of Records(文字列型):レコード数
・Path Order(整数型):路線が停車する駅の順番
・Right Line(文字列型):駅を通過している路線名
・Station(文字列型):駅の名前
・Right Latitude(小数型):駅の緯度
・Right Longitude(小数型):駅の経度

NameとStationの違いがどうしてもわからないが、無駄なカラムってこともありうるのでとりあえず無視。Number of Recordsも多分使わなそう。

2.地図上に駅を表示させる

まずは地図に駅の場所を表示する。緯度、経度のカラムはあるが、これを地理的役割を持たせて地図上に表示させるため、計算で地理的役割を生成するMakepoint関数を使って空間オブジェクトを作成する。名前は「MakePoint」で。

マークの詳細にドロップして地図上にプロットする

これだと駅がプロットされるだけなので、路線図らしく駅と駅の間を線で結ぶ。ここでPathOrderが活躍。路線が進む駅の順番に数字が降られているので、Pathorderを整数型にしてマークにドロップし、マーク種別を線にすると・・・

雑音波形・・・

近いポイント(緯度・経度が近い値同士)で線が引かれるので、雑音波形みたいなのがでてくる
Path Orderの数字順に先を引くため、Path Orderのマークを詳細からパスに変更する。

Path Orderの数字順に線が引かれる

PathOrderは連続値なので、線路の端の駅から別の線路の端の駅にも先が引かれてしまう。ここでBranchの中身を見てみると、路線の支線毎に値がセットされているため、これを属性にいれると、路線ごとの線路のつながり情報になるのでこれで路線図はできる。

少しお化粧するために、詳細にLineを追加して路線名の属性も追加したり、ツールヒントにStationを追加してマウスオーバで駅名が表示されたりできるようにする。色からマーカ表示を「すべて」にして、駅の場所が常にポイントでわかるようにする。


本当は色を変えたり、大きさを調節したり、ツールヒントの表示項目を絞ったりをここでやってもいいけど、どうせ最後にまとめて編集するから今はデフォルトのままで・・・

3.出発駅を選択したら、到着駅候補を出せるようにする

まずは出発駅を選択できるようにしないと始まらないから、出発駅というパラメータを作成。値の追加元でStationを選択してリストを作成する

出発駅から到達できる駅を固定したいので、いずれかのディメンジョンで固定したい。この時Branchのディメンジョンの中身を見てみると、ある路線(Line)の支線毎の枝番号(例えばNorthern Lineの支線1が停車する駅には全て同じBranchの値になる行が存在している)なので、出発駅を特定したら、そこの駅が含まれる枝番号(Branch)と同じ枝番号に入っている駅のリストを作れば良いはず。
ディメンジョンを固定といえばFIXED関数
出発駅として選択したStationのBranchの中で最小のものをBranch毎に出して、そのBranchと同じBranchのStationだけを出力する
1.出発駅と同じStationのBranchを1つ選択する(min()かmax()で1つに絞る)
⇒MIN(IF [出発駅]= [Station] THEN [Branch] END)
2.上記で絞られたBranchの中で、ディメンジョンをBranchで固定して、上で絞られたBranchと同じBranchに属しているStationを出力する
IF {FIXED [Branch]:”絞り込んだBranch”}= [Branch]
THEN [Station] END
まとめると以下の計算で「到着駅」として出力させる

4.選択した出発駅、到着駅をハイライトする

出発駅と到着駅を選んだら、その間の駅の座標と間の路線をハイライトすればOK
そのためには、出発駅のPathOrderと到着駅のPathOrderとその間の駅のPathOrderを持った駅の座標を持ったディメンジョンを作成する。

4-1.出発駅のPathOrder:[Start Line]

Branch毎に(Branchを固定して)出発駅で選ばれた駅のPathOrderを特定する
{FIXED [Branch]:min(
IF [出発駅]=[Stathion] THEN [Path Order] END)}
上記を整数型で返すためにINT()で囲む

Start Line

4-2.到着駅のPathOrder:[End Line]

こちらもStart Lineと同様に到着駅で選ばれた駅のPathOrderを整数型で返す
その前にさっき作った出発駅から直接到着できる駅までの駅リスト「到着駅」を出発駅に応じて動的にリスト化されるように到着駅のセットを作る
到着駅⇒右クリック⇒作成⇒セット

この到着駅セットを使って到着駅のPathOrderを特定する。到着駅セットはもともと文字列型の駅になっているので、Stationを使わず直接取得してくる

4-3.出発駅と到着駅の間の駅の情報だけ計算で導く

これでスタートとゴールのPathOrderは取得できたので、あとはこの2点含めて同一路線上の色をハイライトするためにハイライトする地点の位置座標と、色を変えるための仕掛けを作る
・位置情報⇒”ハイライトする条件(=出発駅と到着駅の間にある駅)”に見合った地点の座標情報を計算する
・色を変えるための仕掛け⇒ブール値でその地点が”ハイライトする条件”に見合った地点であれば「真」を返すようにして、真の場合の色をハイライト色に設定して目立たせる。

〇ハイライトする条件は?
駅がStartLineとEndLineの間にあるということは、そこのPathOrderの値がStartLineとEndLineのPathOrderの間の値だということ。
で、選択する出発駅と到着駅のPathOrderの大小関係は入れ違いになることも考慮して条件を考える
・出発駅のPathOrder(:[Start Line])>到着駅のPathOrder(:[End Line])の場合
条件は [Start Line] >= [Path Order] AND [End Line] <= [Path Order]
・出発駅のPathOrder(:[Start Line])>到着駅のPathOrder(:[End Line])の場合
 条件は[Start Line] <= [Path Order] AND [End Line] >= [Path Order]
なので、これをIf ElseIfでこの条件に見合った時に出力したい属性を指定すればOK。位置情報だったらMakePointの座標情報だし、ブール値だったらTrueを返せばよい
〇位置情報(:[Line Highlight])

Line Highlight

〇ブール値(:[LineHighlight(copy)])

LineHighlight(Copy)

5.地図にハイライト表示する

5-1.ハイライトする駅を設定

まずはLine Highlightの位置情報を地図上に表示するために位置情報属性のLine Highlightを新たなマークレイヤとして追加する(「追加マークレイヤ」にDrag&Drop、形式を「円」にして、変化を検算するために色も変えておく))。
さらに到着駅を選択したいので到着駅のセットをViewに表示して試しに出発駅と到着駅を選んでみるとこんな感じ。

表示したいPathOrderのディメンジョンをマークに追加する。
・途中駅をハイライトするために「Line Highlight(Copy)」を色と詳細に追加
・途中の駅を表示するために「Station」を詳細に追加
・「到着駅セット」を詳細に追加
・路線名をツールヒントに表示したいので「Line」も詳細に追加

5-2.ハイライトする路線を表示

新たに上記と同じ手順でマークを作って種別を線にし、位置情報に追加したStationをPathOrderとBranchにして、パスで表示すればOK
ツールヒントや出発駅と到着駅の名前も表示したいのでどんどん必要なディメンジョンを追加していく。
※シンプルにStationをラベルに追加すると途中駅まで表示されるので、ラベルのStationを「属性」に変更して、ラベルを「終点」だけ表示するように変更が必要

6.地図を化粧直しする

味気ないので地図の表示形式を変更したり、路線・駅の色や透明度を変更するなどして化粧直し。ついでにツールヒントの表示項目も絞る(路線名と駅名くらいで十分)
地図も右クリック⇒バックグラウンドレイヤーからスタイルや表示項目を調整(自分はロンドンの地理なんてさっぱりわからんので色々入れてみた)

7.選択した2つの駅の数のカウント

最終的にはダッシュボードで地図とか出発駅、到着駅の選択とかをするので、別シートで計算した結果を表示するようにする
今回のデータセットであればPathOrderの番号の差の絶対値がそのまま駅の数になる

こちらを、マークに入れて合計を計算し、シートのタイトルに表示する。
⇒「タイトルの編集」で挿入から追加

マークを多角形とか適当なものにすれば余計な文字列がシートから消えて綺麗

8.ダッシュボードに配置して整える

作成したシートをダッシュボードに配置して見た目を整える
・水平コンテナとか使っていい感じに空間を作る
・余計なタイトルは消す
・枠を幅に合わせるとかすると色々見た目もよくなる
・サイズとかはお題目に合わせて設定

完成

9.感想

・あらかじめ用意されたデータのカラムが丁寧に作られていたので、比較的簡単に地図表示は可能
・ハイライトするのに緯度・経度を計算を使って絞り込む発想は他でも使えそう
・難しかった・・・・

実際に作成したVizがこちらhttps://public.tableau.com/app/profile/.39306731/viz/TubeStation/TubeMAPofLONDON


この記事が気に入ったらサポートをしてみませんか?