Python のfolium
を
folium
を夫の<wbr>年齢(各歳),<wbr>妻の<wbr>年齢(各歳)別夫婦数(総数及び<wbr>日本人<wbr>) -<wbr> 全国※,<wbr>全国市部・郡部,<wbr>都道府県,<wbr>21大都市
と
統計表一覧
この
参考
統計表一覧
政府統計の 総合窓口 GL08020103
国勢調査の各種データの ダウンロードリンク、 何かに 使えそうな データが 多数あります。
使い方については アルコールが 入っていない 状態で 真面目に 考えたいと 思いました。 Pythonの
foliumパッケージで 地図を 描いてみる - Qiita
folium のインストール方法、 基本的な 使い方が 記載されています。 Python pandas + folium + Jupyter で
リーフレット / コロプレス図を 描きたい - StatsFragments
今回描きたいコロプレス図の 描き方に ついて 記載されています。 【みんなの
知識 ちょっと 便利帳】 都道府県庁所在地 緯度経度データ - 各都市からの 方位地図 - 10進数/60進数での 座標・世界測地系(WGS84)
都道府県の県庁所在地の 緯度、 経度の リストが ダウンロードできます。
前提
以下の
OS
% sw_vers ProductName: Mac OS X ProductVersion: 10.12.6 BuildVersion: 16G29
pythonの
verion % python -V Python 2.7.10
使用した
folium の version % pip list | grep folium folium (0.3.0)
folium インストール
pip で
pandas も
pip install pandas pip install folium
実施作業の 流れ
以下の
時系列順に
GeoJSON
ファイルの準備 夫の<wbr>年齢(各歳),<wbr>妻の<wbr>年齢(各歳)別夫婦数(総数及び<wbr>日本人<wbr>) -<wbr> 全国※,<wbr>全国市部・郡部,<wbr>都道府県,<wbr>21大都市
データの加工 コロプレス図を
描画 コロプレス図に
ポップアップを 追加する
作成した
コロプレス図に<wbr>ポップアップを<wbr>追加する<wbr>
スクリプトに
GeoJSON
ファイルの 準備
コロプレス図を
夫の<wbr>年齢(各歳),<wbr>妻の<wbr>年齢(各歳)別夫婦数(総数及び<wbr>日本人<wbr>) -<wbr> 全国※,<wbr>全国市部・郡部,<wbr>都道府県,<wbr>21大都市
はGeoJSON
データを
探した
以下、
curlコマンド
curl https://raw.githubusercontent.com/dataofjapan/land/master/japan.geojson > japan.geojson
plot_map.py
動作確認用に以下 python スクリプトを 作成しました。 # -*- coding: utf-8 - import folium def main(): # 地図の基準として兵庫県明石市を設定 japan_location = [35, 135] m = folium.Map(location=japan_location, zoom_start=5) geojson = r'japan.geojson' # geojson読み込み m.choropleth(geo_data=geojson) # 地図をhtml形式で出力 m.save(outfile="map.html") if __name__ == "__main__": main()
実装の
説明
geo_json
メソッドは、folium (0.3.0)
だと対象の メソッドが なくなったらしく、 以下エラーと なりました。 どうも、AttributeError: 'Map' object has no attribute 'geo_json'
python-visualization/folium: Python Data. Leaflet.js Maps. の README.md
に記載の ある choropleth
にメソッドが 置き換わったようです。 出力される
HTML
上記スクリプトを実行すると、 以下のような 地図が 出力されます。
実際は世界地図が 表示されますが、 日本のみ 切り 取ってます。
GeoJSON
の
夫の<wbr>年齢(各歳),<wbr>妻の<wbr>年齢(各歳)別夫婦数(総数及び<wbr>日本人<wbr>) -<wbr> 全国※,<wbr>全国市部・郡部,<wbr>都道府県,<wbr>21大都市
データの 加工
夫の<wbr>年齢(各歳),<wbr>妻の<wbr>年齢(各歳)別夫婦数(総数及び<wbr>日本人<wbr>) -<wbr> 全国※,<wbr>全国市部・郡部,<wbr>都道府県,<wbr>21大都市
は、
DB形式の
元の
不要な
ヘッダ部の 削除 全国、
市の データを 削除し、 都道府県データのみにする -
を0
に置換 各都道府県ごとに、
夫婦の<wbr>年齢差合計
を計算 (夫の 年齢合計 - 妻の 年齢合計) 夫婦の<wbr>年齢差合計
を各都道府県の 総夫婦数で 割る 各都道府県の
地域コードを japan.geojson
と突き合わせ 可能な 形式に 変換
上記手順で
編集したpandas
で
一言で
- CSVの
読み込み 結果 >>> import pandas as pd >>> pd.read_csv('fuhu_seikei.csv') Area Code Area Name Ave Sum 0 1 北海道 2.252136 2850398 1 2 青森県 2.572007 781319 2 3 岩手県 2.451050 747188 3 4 宮城県 2.312749 1255284 4 5 秋田県 2.502581 636549 5 6 山形県 2.369089 671118 6 7 福島県 2.309119 1051790 7 8 茨城県 2.377381 1700355 8 9 栃木県 2.296028 1110933 9 10 群馬県 2.208948 1059895 10 11 埼玉県 2.362114 4159938 11 12 千葉県 2.409113 3622084 12 13 東京都 2.403701 6906918 13 14 神奈川県 2.389190 5160165 14 15 新潟県 2.284645 1302798 15 16 富山県 2.622729 700990 16 17 石川県 2.578889 716160 17 18 福井県 2.634202 513435 18 19 山梨県 2.488761 503541 19 20 長野県 2.442753 1283469 20 21 岐阜県 2.662840 1365110 21 22 静岡県 2.530297 2307603 22 23 愛知県 2.561806 4576349 23 24 三重県 2.617312 1180811 24 25 滋賀県 2.546597 886692 25 26 京都府 2.478029 1473632 26 27 大阪府 2.363501 4681998 27 28 兵庫県 2.467564 3271282 28 29 奈良県 2.538160 867962 29 30 和歌山県 2.598260 610695 30 31 鳥取県 2.373060 320878 31 32 島根県 2.322820 391934 32 33 岡山県 2.397910 1092344 33 34 広島県 2.389589 1624244 34 35 山口県 2.512688 847326 35 36 徳島県 2.399621 432966 36 37 香川県 2.366874 558613 37 38 愛媛県 2.367458 778922 38 39 高知県 2.432469 399066 39 40 福岡県 2.235163 2537348 40 41 佐賀県 2.322415 452922 41 42 長崎県 2.265973 727314 42 43 熊本県 2.279736 956087 43 44 大分県 2.339118 649035 44 45 宮崎県 2.225000 580981 45 46 鹿児島県 2.358946 900669 46 47 沖縄県 2.122128 612737 >>>
コロプレス図を 描画
作成したcsvを
都道府県別の<wbr>夫婦の<wbr>年齢差の<wbr>平均値
を
* plot_map.py
# -*- coding: utf-8 - import folium import pandas as pd def main(): # 地図の基準として兵庫県明石市を設定 japan_location = [35, 135] m = folium.Map(location=japan_location, zoom_start=5) geojson = r'japan.geojson' # CSVデータの読み込み df = pd.read_csv('fuhu_seikei.csv') m.choropleth(geo_data=geojson, data=df, columns=['Area Code', 'Ave'], key_on='feature.properties.id', threshold_scale=[2.2, 2.3, 2.4, 2.5, 2.6, 2.7], fill_color='YlGnBu', reset=True) # 地図をhtml形式で出力 m.save(outfile="map.html") if __name__ == "__main__": main()
- 出力される
HTML
上記スクリプトを実行すると、 以下のような 地図が 出力されます。
理由は不明ですが、 中部地方が 年齢差が 大きいようです。
ポップアップを 追加する
コードが
- 出力される
HTML
説明
アイコンを
MulitiPoligonの GeoJsonの アイコン配置に ついて
少なくともpopup
を
県庁所在地の
ポップアップマーカに ついて
マーカーがREADME.md
からRegularPolygonMarker
、CircleMarker
で
マーカの
key_on の 設定に ついて
ここは
Geojson 上にfeature
はfeatures
は
key_on
のfeature.properties.id
なので、features
> 1要素 feature
と
今回 id とproperties
のon_key
にfeature.properties.id
を
- folium_example/japan.geojson at master · kemsakurai/folium_example
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": { "nam": "Kyoto Fu", "nam_ja": "京都府", "id": 26 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 135.036697387695, 35.537334442138686 ], [ 135.035202026367, 35.53973388671878 ], [ 135.03010559082, 35.53986740112302 ], .........
説明は
作業中発生した エラーに ついて
作業中に
threshold_scale の
要素数を 7以上に した
ValueError
が発生します。 エラー発生箇所をFile "/Library/Python/2.7/site-packages/folium/folium.py", line 247, in choropleth raise ValueError
確認した ところ、 確かに 要素数の 判定を していたので、 要素数6に しました。 if threshold_scale and len(threshold_scale) > 6: raise ValueError
pandasキー値指定の
スペルミス pandas のTraceback (most recent call last): File "plot_map.py", line 23, in <module> main() File "plot_map.py", line 18, in main fill_color='BuPu') File "/Library/Python/2.7/site-packages/folium/folium.py", line 263, in choropleth color_data = data.set_index(columns[0])[columns[1]].to_dict() File "/Library/Python/2.7/site-packages/pandas/core/frame.py", line 2830, in set_index level = frame[col]._values File "/Library/Python/2.7/site-packages/pandas/core/frame.py", line 1964, in __getitem__ return self._getitem_column(key) File "/Library/Python/2.7/site-packages/pandas/core/frame.py", line 1971, in _getitem_column return self._get_item_cache(key) File "/Library/Python/2.7/site-packages/pandas/core/generic.py", line 1645, in _get_item_cache values = self._data.get(item) File "/Library/Python/2.7/site-packages/pandas/core/internals.py", line 3590, in get loc = self.items.get_loc(item) File "/Library/Python/2.7/site-packages/pandas/core/indexes/base.py", line 2444, in get_loc return self._engine.get_loc(self._maybe_cast_indexer(key)) File "pandas/_libs/index.pyx", line 132, in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5280) File "pandas/_libs/index.pyx", line 154, in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5126) File "pandas/_libs/hashtable_class_helper.pxi", line 1210, in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas/_libs/hashtable.c:20523) File "pandas/_libs/hashtable_class_helper.pxi", line 1218, in pandas._libs.hashtable.PyObjectHashTable.get_item (pandas/_libs/hashtable.c:20477) KeyError: 'Area code'
キー値指定の スペルミスで 上記エラーが 発生しました。
スペルミスを直せば 正常に 動作します。 on_key指定の
キー値の スペルミス on_key のTraceback (most recent call last): File "plot_map.py", line 25, in <module> main() File "plot_map.py", line 22, in main m.save(outfile="map.html") File "/Library/Python/2.7/site-packages/branca/element.py", line 157, in save html = root.render(**kwargs) File "/Library/Python/2.7/site-packages/branca/element.py", line 301, in render child.render(**kwargs) File "/Library/Python/2.7/site-packages/folium/map.py", line 299, in render super(LegacyMap, self).render(**kwargs) File "/Library/Python/2.7/site-packages/branca/element.py", line 617, in render element.render(**kwargs) File "/Library/Python/2.7/site-packages/branca/element.py", line 613, in render figure.script.add_child(Element(script(self, kwargs)), File "/Library/Python/2.7/site-packages/jinja2/runtime.py", line 432, in __call__ return self._func(*arguments) File "<template>", line 32, in macro File "/Library/Python/2.7/site-packages/jinja2/runtime.py", line 193, in call return __obj(*args, **kwargs) File "/Library/Python/2.7/site-packages/folium/features.py", line 409, in style_data feature.setdefault('properties', {}).setdefault('style', {}).update(self.style_function(feature)) # noqa File "/Library/Python/2.7/site-packages/folium/folium.py", line 316, in style_function "fillColor": color_scale_fun(x) File "/Library/Python/2.7/site-packages/folium/folium.py", line 304, in color_scale_fun get_by_key(x, key_on) in color_data and File "/Library/Python/2.7/site-packages/folium/folium.py", line 299, in get_by_key '.'.join(key.split('.')[1:]))) File "/Library/Python/2.7/site-packages/folium/folium.py", line 298, in get_by_key get_by_key(obj.get(key.split('.')[0], None), AttributeError: 'NoneType' object has no attribute 'get'
スペルミスで 発生する エラーです。
スペルミスが多すぎます。 TypeError: choropleth() got an unexpected keyword argument ‘geo_path’
この記事を 書いている 最中に、 version (0.4.0) が リリースされました。
version (0.3.0) だと、とm.choropleth(geo_path=geojson)
書けますが、 version (0.4.0) だと、 とm.choropleth(geo_data=geojson)
書くようになりました。 Markerの
追加で warning
以下のwarningが 発生しました。 Map にplot_map.py:92: FutureWarning: Method `add_children` is deprecated. Please use `add_child` instead. m.add_children(marker)
マーカを addする 箇所で、 folium の 過去 version だと、 add_children
と書いていましたが、
非推奨になって、 同じ 役割を する add_child
が作成されたため 発生しています。
単純にadd_child
にメソッドを 変更すれば 解消されます。
まとめ
政府統計 の
以下、
ぱっと
見で おもしろいと 思った データが 加工しておもしろくなるとは 限らない
平均値をとった あたりで、 おもしろさが なくなっていったのかもしれません。
平均化したら、都道府県ごとで それほど 大きい 違いは ありませんでした。
主観的なバイアスを かけたりすると 誇張された 感じには なるかもですが、 マナー違反なきは します。
ただ、政府統計データ自体は 数も 多く、 「何故、 この 観点で 調べたのか 経緯は 全く わからないが 個人的にはおもしろい」と 感じる データが 多く、 まさぐってみたくなりました。 folium自体は
何でもできるわけではないが 使いやすい
popup を出力したり、 onclick アクションを 追加したり、 凝った ことを しようとすると、 詰むか 詰まないかの ところで 試行する ことになりましたが、
コロプレス図自体は、Webの 情報や python-visualization/folium: Python Data. Leaflet.js Maps. の README.md
を参考に すれば、 時間を かける ことなく 望んだ ものが 出力できました。
凝ったことを する 場合は、 Leaflet - a JavaScript library for interactive maps 側の ことも 意識しないと いけないと 思いますが、
基本的なところは、 folium
でだいたいできると感じました。
以上です。
コメント