cartographyパッケージ
R上で主題図の作成ができるcartographyパッケージを紹介します。
地図製作者やRユーザーが直感的に作業できるように設計されているそうで、操作はかなり簡単です。
QGISで主題図を作成すると作業過程が残せないので、R上で主題図が作成できるこのパッケージは非常に便利だと思います。
※使いやすさの観点から標準のplot準拠で作られているので、ggplot2との連携ができない点に注意。
使い方
cartographyのインストール
通常のパッケージ同様、install.packages("cartography", dependencies = TRUE)
でインストールできます。
ただしUbuntuの場合には、以下のライブラリを事前にシステムにインストールしておく必要があります。
sudo apt install libgeos-dev libudunits2-dev libgdal-dev
データの準備
今回は国土数値情報 人口集中地区データのうち、平成 27年度の東京都部分のデータを用います。
手順に従いデータをダウンロードした後、zipを解凍して「A16-15_13_DID.geojson」を作業ディレクトリに移動します。
cartographyはsf
クラスに対応しているので、st_read
でデータを読み込みます。
また緯度経度のままだと実行できても警告が出るので、JGD 2011の9系に投影変換しておきます(参考1、参考2)。
library(sf) # ベクタの読み込み用
library(cartography)
map.original <- st_read("A16-15_13_DID.geojson")
# shpをインポートする場合
map.original <- st_read("A16-15_13_DID.shp")
map <- st_transform(map.original, crs = 6677) # 投影変換
※今回のデータの場合、shpで読み込むと属性名が別のものになるので注意。
シンボルの描画
cartographyではベースとなるポリゴンをplot(st_geometry(map))
で描画し、それにレイヤを重ねることで主題図を作成していきます(plot
に対するlines
やpoints
と同じ)。
基本的には、x
に対象となるsfオブジェクトを、var
にシンボルとして描画する属性を指定します。
階級区分図(Choropleth)
階級区分図は以下のコマンドで描画できます。
plot(st_geometry(map))
choroLayer(x = map, var = "人口", method = "equal", nclass = 8)
分類方法はmethod
で指定でき、"sd", "equal", "quantile", "fisher-jenks","q6","geom", "arith", "em", "msd"から選べます。
分割数が可変の場合はnclass
で分割数を指定できます。
類型図(Typology)
類型図は以下のコマンドで描画できます。
plot(st_geometry(map))
typoLayer(x = map, var = "市町村名称")
類型数が多すぎるため、凡例がはみ出してしまっています。
比例シンボル図(Proportional Symbols)
比例シンボル図は以下のコマンドで描画できます。
plot(st_geometry(map))
propSymbolsLayer(x = map, var = "人口")
階級区分×比例シンボル図(Proportional Symbols)
階級区分の色分けと比例シンボルを組み合わせた図は以下のコマンドで描画できます。
plot(st_geometry(map))
propSymbolsChoroLayer(x = map, var = "人口", var2 = "面積")
var
に比例シンボルに使う属性を、var2
に階級区分に使う属性を指定します。
凡例がかぶってしまっていますが、直し方は後述します。
類型×比例シンボル図(Proportional Symbols)
類型の色分けと比例シンボルを組み合わせた図は以下のコマンドで描画できます。
plot(st_geometry(map))
propSymbolsTypoLayer(x = map, var = "人口", var2 = "市町村名称")
var
に比例シンボルに使う属性を、var2
に類型区分に使う属性を指定します。
ラベルの描画
ラベルの追加には、labelLayer
関数を使います。
plot(st_geometry(map))
choroLayer(x = map, var = "人口", method = "equal", nclass = 8)
labelLayer(x = map, txt = "市町村名称")
txt
にラベルとして使いたい属性を指定します。
ベースマップをOpenStreetMapに
getTiles
を使うことで、背景にOpenStreetMapを使用できます。
tiles <- getTiles(x = map, type = "osm")
tilesLayer(tiles)
plot(st_geometry(map), col = NA, border = "black", add = TRUE) # 塗りつぶしをしない
propSymbolsLayer(x = map, var = "人口")
type
は、"osm", "hotstyle", "hikebike", "osmgrayscale", "stamenbw", "stamenwatercolor", "cartodark", "cartolight", "opentopomap"から選べます。
レイアウトの変更
色の変更
比例シンボルの色はcol
パラメータで変更できます。
plot(st_geometry(map))
propSymbolsLayer(x = map, var = "人口", col = "green")
階級区分図の色はcol
にカラーパレットを指定することで変更可能です。cartographyに入っている、carto.pal
が便利です。
https://github.com/rstudio/cheatsheets/blob/master/cartography.pdf より
plot(st_geometry(map))
choroLayer(x = map, var = "人口", method = "equal", nclass = 8, col = carto.pal("red.pal", 8)) # 赤系パレットに変更
組み合わせパレットを使う場合
plot(st_geometry(map))
choroLayer(x = map, var = "人口", method = "equal", nclass = 8, col = carto.pal(pal1 = "blue.pal", n1 = 4, pal2 = "red.pal", n2 = 4))
類型図も同様に色を変更できます。
plot(st_geometry(map))
typoLayer(x = map, var = "市町村名称", col = carto.pal("multi.pal"))
凡例の編集
凡例の位置やタイトルは、legend.pos
やlegend.title.txt
を変更することで変更できます。
plot(st_geometry(map))
propSymbolsChoroLayer(x = map, var = "人口", var2 = "面積", legend.var.pos = "bottomleft", legend.var.title.txt = "Pop", legend.var2.pos = "bottomright", legend.var2.title.txt = "Area")
ただし今回の類型図のように、あまりにも凡例が大きいときには収めるのが難しそうです。
その場合には、legend.pos
に"n"
を指定して凡例を消したあと、legendTypo
(legendChoro
、legendCirclesSymbols
)を使って再度描画すればできるかも?
方位記号等の追加
方位記号の追加はnorth
で行います。
plot(st_geometry(map))
choroLayer(x = map, var = "人口", method = "equal", nclass = 8)
north(pos = "topright")
スケールの追加はbarscale
で行います。
plot(st_geometry(map))
choroLayer(x = map, var = "人口", method = "equal", nclass = 8)
barscale(size = 20)
スケールの大きさはsize
で指定します。単位はkmで、緯度経度のままだとうまく描画されません。
全体のレイアウト
方位記号、スケール含めて、layoutLayer
で全体のレイアウトを指定できます。
plot(st_geometry(map))
choroLayer(x = map, var = "人口", method = "equal", nclass = 4, legend.pos = "topleft")
layoutLayer(title = "DIDの人口", sources = "Data from http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-A16-v2_3.html", author = "ocean_f", scale = 20, north = TRUE, frame = TRUE)
レイアウト例
以上を使ってレイアウトをすると以下のようになります。ファイルに保存する際には通常のplotと同様、デバイスを起動させて出力します。
実際は描画範囲のコントロールもできるようですが、ここでは省略しています。
png("example.png", width = 780, height = 600)
tiles <- getTiles(x = map, type = "cartolight")
tilesLayer(tiles)
plot(st_geometry(map), add = TRUE)
propSymbolsChoroLayer(x = map, var = "人口", var2 = "面積", col = carto.pal(pal1 = "blue.pal", n1 = 4, pal2 = "red.pal", n2 = 4), legend.var.pos = "left", legend.var.title.txt = "人口(人)", legend.var2.pos = "topleft", legend.var2.title.txt = "面積(km2)")
labelLayer(x = map, txt = "市町村名称")
layoutLayer(title = "DIDの人口と面積", sources = "Data from http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-A16-v2_3.html", author = "ocean_f", scale = 20, north = TRUE, frame = TRUE)
dev.off()
参考・備考
より詳しい使い方は、cartographyのvignetteとcartographyのcheat sheet、cartographyのReference manualを参照してください。他のシンボルの描画もできるうえ、かなり細かくパラメータ設定ができます。
ggplot2でも主題図の作成はできて、より汎用性が高いですが、色分けやラベルの追加にはそれなりの慣れが必要です。
簡単に主題図を作りたいときにはこのパッケージが非常に便利だと思います。