第6章 コロプレス図
1 コロプレス図
区域毎に色分けした図のことをコロプレス図という。japanmapで日本地図のコロプレス図を表示できたが、foliumでもです。
ここでは熊本県の市町村を色分けして表示します。区域を示したデータはGeoJsonファイルといい、国土交通省の国土数値情報ダウンロードサイトからダウンロード可能です。「行政区域(ポリゴン)」より熊本のデータがダウンロードできます(N03-21_43_210101.geojson)。
※なお、このファイルは文字コードがUTF-8のため、Windowsの場合、シフトJISに変換しておきます(WindowsでのPythonの標準文字コードがシフトJISのため)
これをfolium.Choroplethのgeo_dataに指定するだけです。
import folium
map = folium.Map(location=[32.8032, 130.7080],zoom_start = 10)
# GeoJsonファイルを指定し、コロプレス図を作成
ch = folium.Choropleth(geo_data='N03-21_43_210101.geojson')
ch.add_to(map)
map
2 データの反映
データを元にコロプレス図を色分けしてみます。
サンプルデータとして熊本県の市区町村別人口(kumamoto_pop.csv)を使用します。(住民基本台帳に基づく人口、人口動態及び世帯数調査より作成)。
まず、DataFrameにデータを読み込みます。
import pandas as pd
df = pd.read_csv("kumamoto_pop.csv")
df
次に、データとGeoJsonを対応させるキーを決めます。つまり、どのデータがどの区域に該当するかを決めるキーです。
通常は市区町村名で良いのですが、今回のデータの場合、GeoJsonと人口データで同一の名称のものがありません(例えば、GeoJsonではN03_003に「玉名郡」、N03_004に「南関町」と分かれていますが、人口データは「玉名郡南関町」と1つになっています)。そこで、団体コード(GeoJsonではN03_007)を利用します。
Choropleth関数の引数は以下のように指定します。
- data:DataFrame
- columns:DataFrame側の[キーとなる列名, 値となる列名]
- key_on:GeoJson側のキーとなる名前
- fill_color:色(ここを参照)
map = folium.Map(location=[32.8032, 130.7080],zoom_start = 10)
ch = folium.Choropleth(geo_data='N03-21_43_210101.geojson',
data=df,
columns=['団体コード', '計'],
key_on='feature.properties.N03_007',
fill_color='OrRd' )
ch.add_to(map)
map
key_onはJSONファイルの以下を見て判断します。
"features": [
{ "type": "Feature", "properties": { "N03_001": "熊本県", "N03_002": null, "N03_003": "熊本市", "N03_004": "熊本市中央区", "N03_007": "43101" },
※featuresの配列に値が入っているので、配列の1要素ということで feature となる(sが無い)。feature.properties.N03_007 とはfeatures配列の一要素内の properties 内の N03_007 となる。
3 色の指定
Choropleth関数の引数 fill_opacityで塗りつぶしの透明度、line_colorで線の色、line_opacityで色の透明度を指定できます。
map = folium.Map(location=[32.8032, 130.7080],zoom_start = 10)
ch = folium.Choropleth(geo_data='N03-21_43_210101.geojson',
data=df,
columns=['団体コード', '計'],
key_on='feature.properties.N03_007',
fill_opacity=0.7,
line_opacity=0.2,
line_color='red',
fill_color='OrRd' )
ch.add_to(map)
map
もし、欠損がある地域がある場合、その色をnan_fill_color="#888888" のようにして指定できます。