け日記

最近はPythonでいろいろやってます

Python: foliumでJupyter Notebookに地図を描画する

Jupyter Notebook上で、緯度経度の情報を地図へ簡単にプロットできる方法を探していたところ、foliumの使い勝手が良かったので紹介します。

folium

PythonからLeaflet.jsで地図をプロットするパッケージです。

https://github.com/python-visualization/folium

使用前にpip install foliumまたはconda install foliumでインストールします。

地図を表示する

まずは、千葉県千葉市の地図を表示します。

Mapで生成できます。

  • locationオプションに中心の緯度・経度を渡しています
  • Mapインスタンスを出力すると、leaflet.jsが読み込まれて表示されます
  • デフォルトではOpenStreetMapの地図が使われます(tilesオプションでMapboxやStamenにも変更できます)
  • zoom_startで表示する時のズームを変えられます(デフォルト10で、大きくするとより拡大されます)
import folium

chiba_map = folium.Map(location=[35.607451, 140.106340])

chiba_map

f:id:ohke:20180228092918p:plain

マーカをプロットする

次に千葉県の4つの市にマークします(緯度経度は市役所所在地、人口は千葉県のサイトから2018/1/1時点のデータを参照)。

緯度 経度 人口
千葉市 35.607451 140.106340 975,535
館山市 34.996596 139.869906 46,349
銚子市 35.734795 140.826926 61,674
浦安市 35.653146 139.902058 168,169

Markerで地図上にマーカをプロットできます。

  • popupオプションで、マーカをクリックした時表示されるテキストを設定できます
  • add_toメソッドでマップ上にプロットします
import pandas as pd

chiba_cities = pd.DataFrame({
    'city': ['千葉市', '館山市', '銚子市', '浦安市'],
    'latitude': [35.607451, 34.996596, 35.734795, 35.653146],
    'longtude': [140.106340, 139.869906, 140.826926, 139.902058],
    'population': [975535, 46349, 61674, 168169]
})

chiba_map = folium.Map(location=[35.607451, 140.106340], zoom_start=9)

for i, r in chiba_cities.iterrows():
    folium.Marker(location=[r['latitude'], r['longtude']], popup=r['city']).add_to(chiba_map)
    
chiba_map

f:id:ohke:20180228093011p:plain

マーカはいくつか種類があります。

CircleMarkerを使って、人口比を可視化してみます。

f:id:ohke:20180228093047p:plain

緯度経度を含む情報をぱぱっと可視化したいときに便利でしたので紹介しました。

GeoJSONを描画することもできます。詳しくはこちらの方の記事が参考になるかと思います。

国土数値情報とfoliumで市区町村区切りのコロプレス図を描く