LoginSignup
2
3

More than 3 years have passed since last update.

Rのcartographyパッケージで主題図の作成

Posted at

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に対するlinespointsと同じ)。
基本的には、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"から選べます。

choro.png

分割数が可変の場合はnclassで分割数を指定できます。

類型図(Typology)

類型図は以下のコマンドで描画できます。

plot(st_geometry(map))
typoLayer(x = map, var = "市町村名称")

typo.png

類型数が多すぎるため、凡例がはみ出してしまっています。

比例シンボル図(Proportional Symbols)

比例シンボル図は以下のコマンドで描画できます。

plot(st_geometry(map))
propSymbolsLayer(x = map, var = "人口")

prop.png

階級区分×比例シンボル図(Proportional Symbols)

階級区分の色分けと比例シンボルを組み合わせた図は以下のコマンドで描画できます。

plot(st_geometry(map))
propSymbolsChoroLayer(x = map, var = "人口", var2 = "面積")

varに比例シンボルに使う属性を、var2に階級区分に使う属性を指定します。

choro_prop.png

凡例がかぶってしまっていますが、直し方は後述します。

類型×比例シンボル図(Proportional Symbols)

類型の色分けと比例シンボルを組み合わせた図は以下のコマンドで描画できます。

plot(st_geometry(map))
propSymbolsTypoLayer(x = map, var = "人口", var2 = "市町村名称")

varに比例シンボルに使う属性を、var2に類型区分に使う属性を指定します。

typo_prop.png

ラベルの描画

ラベルの追加には、labelLayer関数を使います。

plot(st_geometry(map))
choroLayer(x = map, var = "人口", method = "equal", nclass = 8)
labelLayer(x = map, txt = "市町村名称")

txtにラベルとして使いたい属性を指定します。

label.png

ベースマップを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"から選べます。

osm.png
下は"cartolight"の例。
cartod.png

レイアウトの変更

色の変更

比例シンボルの色はcolパラメータで変更できます。

plot(st_geometry(map))
propSymbolsLayer(x = map, var = "人口", col = "green")

prop_col.png

階級区分図の色はcolにカラーパレットを指定することで変更可能です。cartographyに入っている、carto.palが便利です。
cartopal.png
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)) # 赤系パレットに変更

choro_col.png

組み合わせパレットを使う場合

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))

choro_col2.png

類型図も同様に色を変更できます。

plot(st_geometry(map))
typoLayer(x = map, var = "市町村名称", col = carto.pal("multi.pal"))

typo_col.png

凡例の編集

凡例の位置やタイトルは、legend.poslegend.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")

choro_prop_leg.png

ただし今回の類型図のように、あまりにも凡例が大きいときには収めるのが難しそうです。
その場合には、legend.pos"n"を指定して凡例を消したあと、legendTypolegendChorolegendCirclesSymbols)を使って再度描画すればできるかも?

方位記号等の追加

方位記号の追加はnorthで行います。

plot(st_geometry(map))
choroLayer(x = map, var = "人口", method = "equal", nclass = 8)
north(pos = "topright")

arrow.png

スケールの追加はbarscaleで行います。

plot(st_geometry(map))
choroLayer(x = map, var = "人口", method = "equal", nclass = 8)
barscale(size = 20)

スケールの大きさはsizeで指定します。単位はkmで、緯度経度のままだとうまく描画されません。

scale.png

全体のレイアウト

方位記号、スケール含めて、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)

full_lay.png

レイアウト例

以上を使ってレイアウトをすると以下のようになります。ファイルに保存する際には通常の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()

example.png

参考・備考

より詳しい使い方は、cartographyのvignettecartographyのcheat sheetcartographyのReference manualを参照してください。他のシンボルの描画もできるうえ、かなり細かくパラメータ設定ができます。

ggplot2でも主題図の作成はできて、より汎用性が高いですが、色分けやラベルの追加にはそれなりの慣れが必要です。
簡単に主題図を作りたいときにはこのパッケージが非常に便利だと思います。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3