最終更新: 2024/01/25
参考資料
https://public.tableau.com/app/profile/jack.hineman/viz/WOW2024Week04JapaneseFoodSelfSufficiency/WOW2024Week04Donuts100
https://www.thedataschool.co.uk/nhung-le/easy-sunburst-donut-chat-in-tableau-using-map-layer/
https://workout-wednesday.com/2024w04tab/
Workout Wednesdayの2024/Week4のチャレンジでは、100%を超えるドーナッツチャーをテーマにした問題が出題されました。
Workout Wednesdayコミュニティの素晴らしいところですが、単に問題を解くだけでなく、このような可視化はどうだろうか、というオリジナリティを発揮し共有してくれる方が現れます。 今回の記事はJack Hinemanの以下のVizを参考に、100%を超えるドーナッツチャートの作り方について解説します。
今回使用したWorkbookは以下から参照できます。
使用したデータは以下からダウンロードできます。 https://drive.google.com/drive/folders/1N9VAYTAsvpOJ6N-apntxclel4TfyfigU?usp=sharing
作成するドーナッツチャートの概要と作り方のアイデア
まず今回作るドーナッツチャートの例と、作り方のアイデアを説明します。
今回のデータは2019年度の、各都道府県の食料自給率(カロリーベース)を扱います。例えば上記の例では、北海道は食料自給率が216%あります。
このような100%を超える(上記の例ではさらに200%も超えている)場合に、円グラフやその派生形のドーナッツチャートをどのように可視化するか、が今回のテーマです。
今回作成するドーナッツチャートは、0-100%、100-200%、200-300%に階層を分けて、それぞれ外側に積み重なるように作成します。
上記の例では、一番外側の紫色の部分が200%以上の16%分を示しています。
ただし円グラフを複数作成するためには複数のマークが必要です。
この部分はデータ加工により、例えば各年度・各都道府県の食料自給率の値に応じてデータ行数を増やすなどの処理を行っても良いですが、今回は極力元々のデータを加工せずに複数マークを用意するアプローチをとります。
上記を達成するためのキーワードは以下です。
ダミーデータをRelationで結合する
Map Layerを使用する
作り方
まず初めに、ダウンロードしたデータを以下のように結合します。
Relationの結合キーは上記のように、計算フィールドの作成から設定します。 要はCROSS JOINになるように設定してあげます。
次に以下計算式を作成します。
Point 0-100
IF [Path] = 1 THEN MAKEPOINT(0,0) END
Point 100-200
IF [Path] = 2 THEN MAKEPOINT(0,0) END
Point 200-300
IF [Path] = 3 THEN MAKEPOINT(0,0) END
Point Circle
MAKEPOINT(0,0)
Percent
// [0-1]スケールのパーセント集計値を作成する。
MIN([Self-sufficiency ratio for food in calorie base 【%】])/100
Pie
MIN( // 100%超過分を取得
1,
MAX( //マイナス値を0にするためのMAX()
[Percent] - (MIN([Path])-1)
, 0
)
)
Pie Inverse
// 円グラフの残り部分を計算
1 - [Pie]
この計算式の中身を理解するために、以下手順に沿ってMap Layerを作成してみましょう。
まずは[Point 0-100]をシート上にドラッグ&ドロップします。またFiscal Year = 2019、Prefecture = Hokkaidoでフィルターします。
まずは円グラフを作ってみます。ただし今回の計算式は[Path]ディメンションが重要なので、以下のように列に[Path]を入れ、円グラフを作成してみましょう。
そのままでは円グラフがかなり小さいので、サイズは最大にしてください。
もう少しだけ先に進みます。[Point 100-200]をドラッグし、以下画像中のように、Map Layerに追加をする箇所上でドロップします。
同様に[Point 200-300]もMap Layerに追加し、また同様の手順で円グラフをそれぞれのMap Layerで作成します。
ここまでの手順により、以下のようなVizが出来ているはずです。
[Point 0-100]は0~100%の円グラフのためのMap Layerであり、[Point 100-200]および[Point 200-300]も同様に、それぞれ100~200% / 200~300%の円グラフのためのMap Layerです。
FY2019の北海道は食料自給率が216%あるため、[Point 0-100]と[Point 100-200]の円グラフは100%で埋められ、[Point 200-300]のみが残りの16%分の円グラフを可視化しています。
最終的にはこの円グラフを重ねることで目的のドーナッツチャートが出来上がりますが、重ねる前に円グラフが区別できるようにしましょう。
それぞれのMap Layerについて、[Path]ディメンションを色マークおよびサイズマークに追加します。
また[Pie Inverse]については円グラフの残り部部のための計算フィールドなので、ここでは白色など目立たない色に変更します。
目的のドーナッツチャートにかなり近づきました。
列から[Path]を削除し、またMap Layerの順番を変更し、内側の円グラフが手前側に表示されるようにします。 (ドラッグ&ドロップ等で順番を変えられます)
ここまでで作成したいドーナッツチャートは大体できました。
あとはドーナッツの穴を同様に作成します。 [Point Circle]を同じくMap Layerに追加し、円マークにします。
都道府県などラベルとして使いたい数字を追加し、円の大きさを調整します。
ここでTipsですが、自動生成された緯度または経度を削除することで、画面上部の表示オプションを選択できるようになります。
(地図ではなく通常の座標系で扱われるようになるからですかね?
そして見た目の調整をしてあげれば、以下のようなドーナッツチャートが完成します。
ちなみにMap Layerの利点の一つとして、マークをクリック/選択することを無効化することができます。
詳細は以下を確認ください。
最後に
今回の実装について利点と所感を簡単にまとめます。
実装が簡単
値に応じて層/Layerを分けて描画する、というアイデアに沿って実装しているので、基本的には計算フィールドでの条件分岐と、それに合わせたMap Layerの実装で話が完結している。
円グラフのサイズを一元管理できる実装にできるので調整が楽
[Path]ディメンション(MIN([Path])などのメジャーでも実際はOK)で円グラフのサイズが管理されているので、どれか一つの円グラフのマークサイズを変えれば、他も自動的に変更される。 各マークサイズを調整してもいいが、それはそれで調整が大変そう。
中心の円も同様に一元管理できる実装とすることも可能だが、ダミーデータ側に工夫が必要なので、今回は対象外としました。
元ネタのように、完全に重ねることも可能
色の与え方とMap Layerの順番を変える必要があります。サイズは任意でOKですが、共通の計算フィールドをサイズに入れておくと、設定しておくと複数の円グラフをまとめてサイズ調整できます(例の場合はMIN(1)を使用)。
今回のデータで、300%以上も現れたらどうするか
ダミーデータの行数を増やして、Map Layerも一層追加する必要があります。
WOW2024 Week4のチャレンジページでも述べられているように、そもそも100%を超えるような数字に対して円グラフ/ドーナッツチャートを使用する是非はあるとは思いますが、その中でも見やすくなるような実装を試してみる価値はあると思います。
(ただし今回の実装もそうですが、ある程度上限が予想できる数字に限りそうですね)
質問などありましたらTwitterかLinkedinまでお願いします。
ぜひ元ネタのWorkout Wednesdayの問題も解いてみて下さい。