R言語 + Leafletでコロプレス

 コロプレス(統計表現地図) Choroplethを作ってみたい、ということで辿り着いたのがR言語のleafletRパッケージ(github.com/chgrl/leafletR/)。

 シェープファイル読み込み ⇒ コロプレス作成 ⇒ 描画
という流れがスムーズなのかもしれないが、leafletRのおかげでLeafletでTopoJSONファイルを描画できるようになった。

 コロプレスも少ないコマンドで作れる。

 地球地図日本のpolbnda_jpn.shpには、あらかじめ人口データ popが入っているので、それを使って色塗り(色分け)してみる。
 2014年のデータなので、新しいデータは統計局からダウンロードするなど手を加えなければならないが、このまま利用する。

データのチェック

 今一度QGISの属性テーブルでpolbnda_jpn.shpのデータを見直してみると手直しする点がいくつかあった。

 まず島や飛地がある市町村について、複数の地物(ポリゴン)データを1つのデータにまとめる。マルチポリゴン MultiPolygon化

 QGISのベクタ - 空間演算ツール - 融合
 融合フィールドに市町村コードの列(adm_codeが該当)を指定してまとめる。 

 市町村の列(laa)を指定してまとめると同名の市町村(例えば山形県小国町と熊本県小国町)がまとまってしまうので注意。

 総地物数は2914から1750へ。

 人口データが消えてしまう市町村があったので(-89999999のデータが残ってしまう)、チェックしながら気長に手直し。もっとスマートな方法があるはずだが……。

 北方領土6村の人口データは-99999999となっているので、便宜上0とした。

 市町村がUNK(=Unknown)となっている東京都の地物データは、八丈島・青ヶ島の南の鳥島のデータ。東京都だが、どの市町村にも属していない珍しい地域。

 まとめたにもかかわらず、秋田県東成瀬村、島根県隠岐の島町の地物データが2つあったので、合っていない市町村コードの方の地物データを消去。

 総地物数は1748。

 令和元年現在、日本の市町村数は1724。
 + 東京23区
 + 鳥島
 で1748。合っている。

 2014年以降、日本の市町村数(東京23区含む)は1747(北方領土6村含む)のまま。
 2014年、栃木県下都賀郡岩舟町 ⇒ 栃木県栃木市編入以降、市町村の合併・編入は行われていないので、市町村数は変わっていない。

 市制施行、市名変更はあるが、図形情報は基本的にそのまま使える。

  •  2014年 岩手県岩手郡滝沢村 ⇒ 岩手県滝沢市
  •  2016年 宮城県黒川郡富谷町 ⇒ 宮城県富谷市
  •  2018年 福岡県筑紫郡那珂川町 ⇒ 福岡県那珂川市
  •  2019年 兵庫県篠山市 ⇒ 兵庫県丹波篠山市

 レイヤ - 属性テーブルを開く   カラムを削除する
で特に必要ではないカラム(=列)を4つ削除。

 GeoJSON ⇒ TopoJSON ⇒ mapshaperで簡素化。

 ファイルサイズ600KB弱。

 簡素化しすぎると地物データが消滅して、nullデータができてしまう。沖縄県渡名喜村が一番目に消えてしまった。

 ソースコードのミスではなく、データがおかしい場合もエラーが出る。また、ミスがあるのにエラーが出ない場合もある。
 データのチェックは大変重要かつ大変。

leafletRでコロプレス

 整えてサイズを小さくしたTopoJSONファイル(polbnda_jpn_ctv.topojson)を作業するディレクトリ(C:/……)に置いて、R起動。

 ファイル - ディレクトリの変更

 leafletRパッケージのインストール。

library(leafletR)

 階級分け、凡例づくりが肝。

JPctv_style <- styleGrad(prop="pop", breaks=seq(0,4000000,by=500000), style.val=rev(heat.colors(8)), leg="2014年人口", fill.alpha=0.8, lwd=1, col="grey")

 prop(=property)に列名。人口データ pop。
 breaks=seq(0,4000000,by=500000)は、人口0人~400万人を階級幅50万人で分ける、という意味。
 style.val=rev(heat.colors(8))で、カラーパレット設定。計8階級。

 カラーパレットはheat.colors()の他、

  •  cm.colors()
  •  topo.colors()
  •  terrain.colors()
  •  rainbow()
  •  
  •  
  •  

 leg(=legend)は凡例のタイトル。
 その後はポリゴンの透過度など。

JPctv_map <- leaflet(data="polbnda_jpn_ctv.topojson", title="2014pop", base.map="osm", style=JPctv_style, popup="*")

でJSONファイルを読み込んで処理開始。
 Your leaflet map has been saved under C:/……  
 ⇒ C:/……にHTMLが生成される。

 ベースマップは、OpenStreetMapを指定。
 popup=(“*”)の*は全てのカラム(列)をポップアップ。
 生成されたHTMLをいじれば、ポップアップしたくないカラム(列)を削ることができる。

 その他、leaflet.jsなどのプラグインを最新のものに変えたり ……。

 日本語の文字化けはHTMLの文字コードをUTF-8に変えることで解消される。

生成されたHTML コロプレス(2014年人口)   

 東京が23区に分かれたままなので、東京23区(東京特別区)が目立たない。
 東京23区が人口最多だが、海外の知らない人が見ると横浜市が中心に見えるはず。
 データが視覚化されると分かりやすいが、読み違えないよう注意。

MAP R
スポンサーリンク
ふシゼン
タイトルとURLをコピーしました