【foliumのPlugins】HeatMap(ヒートマップ)の使い方
今回は、地図作成ライブラリfoliumの数あるPluginsの中の1つHeatMapを使ってみる。
HeatMap(ヒートマップ)とは
二次元データの数値の高低を、色やその濃淡で表したもの。「マップ」と付いてますが必ずしも地図で表現する訳ではなく、テーブルを値で色分けしたものなどもヒートマップと呼ぶ。色んな種類のヒートマップがある。
地図を色分けする方法として、他に似たものでは コロプレス図(階級区分図) がある。例えば地図を都道府県ごとに境界線で別けて、なにかの統計データによって色分けする。アメリカ大統領選州ごとに赤と青で色分けされた地図など。
使い方
HeatMapクラスの引数と、デフォルト値。
folium.plugins.HeatMap(
data,
name=None,
min_opacity=0.5,
max_zoom=18,
radius=25,
blur=15,
gradient=None,
overlay=True,
control=True,
show=True,
**kwargs,
)
Heatmapのレイヤー(層)を作ります。
- パラメータの説明
| 引数 | 形式 | 説明 |
|---|---|---|
| data | [ lat, lng ] か [ lat, lng, weight ]の、2次元のリストかNumpy配列 | この座標群に点が置かれる |
| name | string型。デフォルトはNone |
レイヤー(層)に名前をつける。LayerControlで表示する用 |
| min_opacity | int型。 デフォルトは1。 |
ヒートの色をスタートする時の不透明度。 |
| max_zoom | int型。 デフォルトは18 |
ズームレベルが最大強度 (ズームのしかたの強弱) |
| radius | int型。 デフォルトは25 |
ヒートマップの点の半径。 |
| blur | int型。 デフォルトは15 |
ブラー(ぼかし)の程度。 |
| gradient | dict型。 デフォルトは None |
色のグラデーションの設定。 例 {0.4: 'blue', 0.65: 'lime', 1: 'red'} |
| overlay | bool型。 デフォルトはTrue |
オプションとして、層を追加する。overlay層(True) または base層(False) |
| control | bool型。 デフォルトはTrue |
レイヤー(層)を LayerControlに含めるかどうか。 |
| show | bool型。 デフォルトはTrue |
レイヤー(層)を開いて表示するかどうか。 (overlay のみ)。 |
- HeatMapのヘルプ
以下を実行で表示されます。
# ヘルプ help(folium.plugins.HeatMap) # または (Jupyter上で ?folium.plugins.HeatMap
ヒートマップ地図作成
引数がたくさんあるが、簡単なものだけを。
座標のみ指定
複数の座標のみ指定します。
HeatMap()の引数の座標は2次元で! さもないとエラーが出ます。
import folium from folium import plugins # 中心座標(適当 center = [32, 131] # ベースの地図作成 m = folium.Map(center, zoom_start=12) # ヒートマップ層を地図に追加 folium.plugins.HeatMap( data=[center] # 注意! 2次元にして渡す ).add_to(m) # 表示 m
ただ座標を置いただけのHeatMapレイヤーを生成し、ベースの地図に追加させたもの。
都道府県庁の座標と何かのデータ
都道府県ごとの何かのデータを、都道府県庁の座標と結合させた自作のデータを使ってプロットしてみます。
# 保存済みの変数読み込み
%store -r
# 緯度、経度、何かの数
df_ll
| 1 | 2 | 何かの数 | |
|---|---|---|---|
| 0 | |||
| 愛知県庁 | 35.180319 | 136.906107 | 55523 |
| 秋田県庁 | 39.718600 | 140.102334 | 1044 |
| 青森県庁 | 40.824229 | 140.740106 | 2793 |
| 千葉県庁 | 35.604977 | 140.123051 | 53284 |
| 愛媛県庁 | 33.841658 | 132.765660 | 3048 |
| 福井県庁 | 36.065094 | 136.221754 | 1759 |
| 福岡県庁 | 33.606314 | 130.418029 | 42183 |
| 福島県庁 | 37.750046 | 140.467769 | 6223 |
| 岐阜県庁 | 35.391149 | 136.722199 | 9785 |
| 群馬県庁 | 36.390642 | 139.060315 | 9451 |
| 広島県庁 | 34.396563 | 132.459628 | 12516 |
| 北海道庁 | 43.064309 | 141.346832 | 45830 |
| 兵庫県庁 | 34.690972 | 135.183318 | 45908 |
| 茨城県庁 | 36.341807 | 140.447210 | 13516 |
| 石川県庁 | 36.594783 | 136.625839 | 5519 |
| 岩手県庁 | 39.703327 | 141.152920 | 2078 |
| 香川県庁 | 34.340297 | 134.043326 | 2424 |
| 鹿児島県庁 | 31.560183 | 130.557968 | 4159 |
| 神奈川県庁 | 35.447771 | 139.642542 | 90931 |
| 高知県庁 | 33.559497 | 133.531136 | 2144 |
| 熊本県庁 | 32.789826 | 130.741478 | 7467 |
| 東京都庁 | 35.689634 | 139.692101 | 19371 |
| 京都府庁 | 35.020934 | 135.755311 | 6030 |
| 三重県庁 | 34.730421 | 136.508835 | 10241 |
| 宮城県庁 | 38.268672 | 140.872170 | 3358 |
| 宮崎県庁 | 31.910908 | 131.423898 | 5539 |
| 長野県庁 | 36.651282 | 138.180972 | 3630 |
| 長崎県庁 | 32.750336 | 129.867908 | 9261 |
| 奈良県庁 | 34.685311 | 135.832908 | 4317 |
| 新潟県庁 | 37.902242 | 139.023511 | 3791 |
| 大分県庁 | 33.238200 | 131.612674 | 8627 |
| 岡山県庁 | 34.661847 | 133.934679 | 27085 |
| 沖縄県庁 | 26.212523 | 127.680771 | 118923 |
| 大阪府庁 | 34.686401 | 135.520129 | 2877 |
| 佐賀県庁 | 33.249439 | 130.298804 | 62131 |
| 埼玉県庁 | 35.857315 | 139.648722 | 6404 |
| 滋賀県庁 | 35.004461 | 135.868534 | 780 |
| 島根県庁 | 35.472679 | 133.050725 | 11613 |
| 静岡県庁 | 34.977156 | 138.383126 | 8919 |
| 栃木県庁 | 36.565806 | 139.883615 | 1834 |
| 徳島県庁 | 34.065955 | 134.559303 | 236119 |
| 鳥取県庁 | 35.504091 | 134.237919 | 917 |
| 富山県庁 | 36.695565 | 137.211249 | 2434 |
| 和歌山県庁 | 34.225808 | 135.167491 | 3145 |
| 山形県庁 | 38.240320 | 140.363574 | 2259 |
| 山口県庁 | 34.185893 | 131.470725 | 3370 |
| 山梨県庁 | 35.664140 | 138.568556 | 2673 |
HeatMap()の引数dataは、[緯度, 経度, weight]を2次元のリストかNumpy配列で渡すこともできるとなっているので、このまま使います。
↑のデータフレームをvaluesでNumpy配列に変換して渡した例が次。
import folium from folium import plugins import pandas as pd # 中心座標(平均値を列で出す center = df_ll.iloc[:,0:2].mean(axis=0).values center
array([ 35.38254685, 136.03995172])
# ベースの地図作成 m = folium.Map(location=center, zoom_start=5) # ヒートマップ層を地図に追加 folium.plugins.HeatMap( data = df_ll.values, # 2次元を渡す radius=15, ).add_to(m) # 保存 m.save('pcr_positive.html') # 表示 m
実はコロナの陽性者数のデータを都道府県庁の座標と結合させたデータだったのですが、結合をミスったみたいでw徳島が熱い地区になってしまっている。
おわりに
ヒートマップの作り方とかより、座標とデータを集めたり整形するのが大変。
昔、原爆を積んだ米軍の輸送機が墜落したことがあった。核兵器は容易に核爆発しない構造らしく、そこは免れたのだけど、爆弾が行方不明で見付からない。そこで地図をメッシュ状に分割して、航空機の残骸などから爆弾の落ちているポイントを確率計算して探したのだと。確率をヒートマップで表せば、濃淡の濃いメッシュをピンポイントで探索するとき分かりやすい図になる。
他にどんな使い方があるだろう?
今回は以上。