よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【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

Make this Notebook Trusted to load map: File -> Trust Notebook

ただ座標を置いただけの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
Make this Notebook Trusted to load map: File -> Trust Notebook

実はコロナの陽性者数のデータを都道府県庁の座標と結合させたデータだったのですが、結合をミスったみたいでw徳島が熱い地区になってしまっている。

おわりに

ヒートマップの作り方とかより、座標とデータを集めたり整形するのが大変。

昔、原爆を積んだ米軍の輸送機が墜落したことがあった。核兵器は容易に核爆発しない構造らしく、そこは免れたのだけど、爆弾が行方不明で見付からない。そこで地図をメッシュ状に分割して、航空機の残骸などから爆弾の落ちているポイントを確率計算して探したのだと。確率をヒートマップで表せば、濃淡の濃いメッシュをピンポイントで探索するとき分かりやすい図になる。

他にどんな使い方があるだろう?



今回は以上。