今回のテーマはHexbin Mapです。
以下のViz作成を通して解説します。
![](https://static.wixstatic.com/media/2bbf02_50a7a1a1124a449098f3a61b4f1bb791~mv2.png/v1/fill/w_980,h_785,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/2bbf02_50a7a1a1124a449098f3a61b4f1bb791~mv2.png)
リファレンスは以下です。
Tableau Workbookは以下からダウンロードできます。
今回のデータは以下を使用します。
【Hexbin Mapについて】
詳細は以下の記事をご参照下さい。
ざっくり説明すると、郵便番号のような粒度の細かいデータが大量にある場合、地図がとてもmessyな感じになってしまうので、隣接するものを適度にまとめて、地図を見やすくする方法です。
![](https://static.wixstatic.com/media/2bbf02_6647a696a7f848ae84e11a025357780b~mv2.png/v1/fill/w_980,h_531,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/2bbf02_6647a696a7f848ae84e11a025357780b~mv2.png)
![](https://static.wixstatic.com/media/2bbf02_ae993bb87656448a9da8b1b9fb5bb5fb~mv2.png/v1/fill/w_980,h_531,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/2bbf02_ae993bb87656448a9da8b1b9fb5bb5fb~mv2.png)
![](https://static.wixstatic.com/media/2bbf02_97d28b209bfb4ddeadd97bf2b8d5428e~mv2.png/v1/fill/w_980,h_531,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/2bbf02_97d28b209bfb4ddeadd97bf2b8d5428e~mv2.png)
ところでこのHEXBIN関数を用いたHexbin Map、マークタイプがShapeなので、このヘキサゴンの大きさはSizeの調整によるところが大きいです。
どういうことかというと、ちょっとズームすると、もうスカスカなんですよね。
これをColor横のSizeで調整しなければいけない、という状態が生じます。
![](https://static.wixstatic.com/media/2bbf02_b350ecdbb116483c9aa133250ec34822~mv2.png/v1/fill/w_980,h_531,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/2bbf02_b350ecdbb116483c9aa133250ec34822~mv2.png)
これを解決するために、Data DensificationとPolygonを使用して、Hexbin Mapを作成します。
【Popygon Hexbin Mapの作り方】
今回の使用データを以下のようにINNER-JOINさせます。
![](https://static.wixstatic.com/media/2bbf02_83c61f1cec754c50a6fdabca49facfc3~mv2.png/v1/fill/w_540,h_232,al_c,q_85,enc_avif,quality_auto/2bbf02_83c61f1cec754c50a6fdabca49facfc3~mv2.png)
まず、下記の計算フィールドを作成します。ここでHexbin Sizingは整数型パラメータです。
Measure
[y-2016]
Hex Latitude
HEXBINY([Longitude]*[Hexbin Sizing],[Latitude]*[Hexbin Sizing])
/ [Hexbin Sizing]
Hex Longitude
HEXBINX([Longitude]*[Hexbin Sizing],[Latitude]*[Hexbin Sizing])
/ [Hexbin Sizing]
ここからヘキサゴンのPolygonを作成するため、以下の計算フィールドを用意します。
Paddingからはサイズ1のBinを作成します。
Padding
IF [zip_code] = { FIXED [Hex Latitude],[Hex Longitude] : MIN([zip_code])}
THEN 1 ELSE 6 END
Angle
PI()/3 * INDEX()
これらを使用して、下記の計算フィールドを作成します。
Polygon Hex Latitude
WINDOW_MIN(MIN([Hex Latitude])) + SIN([Angle])/[Hexbin Sizing]
Polygon Hex Longitude
WINDOW_MIN(MIN([Hex Longitude])) + COS([Angle])/[Hexbin Sizing]
Measure (Polygon)
WINDOW_SUM(SUM([Measure]))
ここでそれぞれの表計算はPadding(bin)を使用するように設定してください。
![](https://static.wixstatic.com/media/2bbf02_949fe2bb4e9249dca4cbf769ee7e0e14~mv2.png/v1/fill/w_462,h_273,al_c,q_85,enc_avif,quality_auto/2bbf02_949fe2bb4e9249dca4cbf769ee7e0e14~mv2.png)
さて、ここでいくつかの計算フィールドの補足をします。
HEXBIN関数の本質は、地図上の点をまとめ上げることでした。
今回の場合は、あるHex Latitude/Longitudeに、複数のzip_codeが含まれることになります。
Polygon Hex Latitude/Longitudeは、そのzip_codeの集合の中心点からsinとcosで六角形の頂点を与え、その頂点に沿ってPolygonを描写します。
Measure (Polygon)は、そのPolygon内に含まれるMeasureを全て足し合わせた数値を返します。
表計算はVizの作りを見た方が分かりやすいと思いますので、ここでViewをお見せします。
ここでPadding (bin)のMissing Valueが表示させることをお忘れなく。
![](https://static.wixstatic.com/media/2bbf02_528ab5b0f4364e3ba2c230f18ada6693~mv2.png/v1/fill/w_980,h_531,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/2bbf02_528ab5b0f4364e3ba2c230f18ada6693~mv2.png)
参考のために、各Hex Latitude/Longitudeでのzip_codeでのMeasureと、各PolygonでのMeasure (Polygon)を比較表示します。
![](https://static.wixstatic.com/media/2bbf02_d6b87effd8d04164819d8ce8483c40f2~mv2.png/v1/fill/w_980,h_779,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/2bbf02_d6b87effd8d04164819d8ce8483c40f2~mv2.png)
ところで、あるHex LatitudeとHex Longitude(とHexbin Sizingパラメータ)の組み合わせでは、そこに含まれるzip_codeが1つだけという場合があります。この場合は、今回のPaddingの式ではData Densificationができないため、Polygonを描写できません。
これを避けるのであればSelf-UNIONでのData Densificationをすればいいのですが、無理に地図を埋めることもないのかなぁと。
さて、これでPolygonによるHexbin Mapは完成です。これでMapをズームしてもスカスカすることはありません。
しかし、実は問題を一つ残しています。この状態では、実は六角形が歪んでいます。特に北側は縦に引き延ばされていますね。
これを解決するために、ひと手間加えます。
【Polygon Hexbin Mapを修正する】
Tableau上の地図はメルカトル図法による地図なので、その地図上へ緯度経度を投影させてPolygonを描写させるのであれば、緯度経度→xy平面への変換が必要です。
その変換については以下が参考になります。
というわけで、その変換をする計算フィールドを用意します。
ここでEarth Radius (km)は整数型パラメータで、6371が入っています。
Hexbin Size (km)も同様に整数型パラメータです。
Mercator Lat
[Earth Radius (km)] * LN(TAN(PI()/4 + (RADIANS([Latitude])/2)))
Mercator Long
[Earth Radius (km)] * RADIANS([Longitude])
HexLat Adjusted
HEXBINY([Mercator Long] / [Hexbin Size (km)],
[Mercator Lat] / [Hexbin Size (km)])
* [Hexbin Size (km)]
HexLong Adjusted
HEXBINX([Mercator Long] / [Hexbin Size (km)],
[Mercator Lat] / [Hexbin Size (km)])
* [Hexbin Size (km)]
ここで作成したHex Lat/Long Adjustedを用いて、Paddingの式も修正します。
Padding (Adjusted)
IF [zip_code] = { FIXED [HexLat Adjusted],[HexLong Adjusted] : MIN([zip_code])}
THEN 1 ELSE 6 END
Angleも使用するPaddingが変わるので、改めて作っておきましょう。
これ以降の表計算はすべてPadding (Adjusted) (bin)を使用するように設定してください。
Angle (Adjusted)
PI()/3 * INDEX()
Measure (Polygon) (Adjusted)
WINDOW_SUM(SUM([Measure]))
PolygonLat Adjusted
DEGREES(
2*ATAN(
EXP(
(
(WINDOW_AVG(AVG([HexLat Adjusted]))
+ SIN([Angle])*[Hexbin Size (km)]
)
/ [Earth Radius (km)]
)
)
)
- PI()/2
)
PolygonLong Adjusted
DEGREES(
(
WINDOW_AVG(AVG([HexLong Adjusted]))
+ COS([Angle])*[Hexbin Size (km)]
)
/ [Earth Radius (km)]
)
最後のPolygonLat/Lon Adjustedが仰々しくなったのは、xy平面→緯度経度への逆変換のためです。この式も参考URLに記載されています。
以下のように配置すれば、修正後のPolygon Hexbin Mapは完成です。
![](https://static.wixstatic.com/media/2bbf02_05a42c5f17dd4c67a301986c5119fb49~mv2.png/v1/fill/w_980,h_531,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/2bbf02_05a42c5f17dd4c67a301986c5119fb49~mv2.png)
あとは適当にフォーマットを整えて配置すれば、目標のVizができます。
詳細はWorkbookをダウンロードしてください。
![](https://static.wixstatic.com/media/2bbf02_50a7a1a1124a449098f3a61b4f1bb791~mv2.png/v1/fill/w_980,h_785,al_c,q_90,usm_0.66_1.00_0.01,enc_avif,quality_auto/2bbf02_50a7a1a1124a449098f3a61b4f1bb791~mv2.png)
Polygonを用いたHexbin Map、いかがでしたか。
ご質問等はTwitterまたはLinkedinまでよろしくお願いします。