library(sf)
library(tidyverse)
library(here)はじめに
第1回でGISデータの読み込みと簡単なハンドリング、プロットを行いました。
今回は、1.5回として、プロットにフォーカスしてもう少し踏み込んでいきたいと思います。
使用するデータ
第1回と同じデータを用います。
福島県の行政区域データ(2024年、ポリゴン)
福島県の公園データ(2011年、ポイント)
これらのデータを、ワーキングディレクトリにdataフォルダを作って入れておいてください。
使用するパッケージ
{sf}と{ggplot2}です。{ggplot2}は{tidyverse}パッケージ群に含まれていますので、後者で読み込みます。
データの読み込み
前回と同様です。公園のポイントデータには座標参照系(CRS)が設定されていないので、st_set_crs()でデータ本来の座標系に設定し、その上でJDG2011に修正しています1。
本来の座標参照系はデータダウンロードのページ内に記載されています。
fukushima <- read_sf(here("data/N03-20240101_07_GML/N03-20240101_07.shp"))
park <- read_sf(
here("data/P13-11_07_GML/P13-11_07.shp"),
options = "ENCODING=Shift_JIS"
) |>
# JGD2000/(B, L) データ本来のCRS
st_set_crs(st_crs(4612)) |>
# JGD2011/(B, L) 変換したいCRS
st_transform(st_crs(6668))
# 必要な変数を抽出&リネーム
fukushima <- fukushima |>
select(
name_pref = N03_001, # 都道府県名
name_muni = N03_004, # 市区町村名
geometry # プロットに必要
)
park_s <- park |>
select(
name_park = P13_003, # 公園名
name_pref = P13_005, # 都道府県名
name_muni = P13_006, # 市区町村名
geometry
)プロットの基本
まずは前回のプロットを確認します。
ggplot() +
geom_sf(data = fukushima) +
geom_sf(data = park_s, color = "orange") + # 点の色も指定
theme_void()
ポイント:
ggplot()でプロットを開始geom_sf()で各地理データをプロット- 括弧内では
data =を明記(ないとプロットできない)
- 括弧内では
- コードを書いた順に上書き
- 公園のデータを先にプロットするとその後に書いた地図に消されてしまう
theme_void()でシンプルな背景に- 緯度経度までプロットしたいことはあまりないと思いますが、軸も表示しつつシンプルなテーマを使いたい場合はこちらも参考にしてください。
地図の塗りつぶし
全体
例えば、デフォルトで市町村はグレーに塗られていますが、ここも白にしたいとします。
ggplot() +
geom_sf(data = fukushima, fill = "white") +
geom_sf(data = park_s, color = "orange") +
theme_void()
fillをgeom_sf()内で指定することにより、塗りつぶすことができます。
一部
時には一部の市町村だけ塗りつぶしたいこともあると思います。ここでは例として、公園が集中している福島市、郡山市、会津若松市、いわき市を塗りつぶしてみます。
まずはデータの加工からです。
fukushimaのデータを加工し、4市のいずれかであればTRUEをとる変数を作ります。
citiesに該当する市の名前を格納し、name_muni %in% citiesでname_muniがcitiesに入っていればTRUE、そうでなければFALSEをとるようにします。
cities <- c("福島市", "郡山市", "会津若松市", "いわき市")
fukushima <- fukushima |>
mutate(is_in4cities = name_muni %in% cities)次にis_in4citiesがTRUEであれば塗りつぶすようにコードを修正します。
ggplot() +
geom_sf(data = fukushima, aes(fill = is_in4cities)) +
geom_sf(data = park_s, color = "orange") +
theme_void()
aes(fill = is_in4cities)を追加したことで、色分けをすることができました。変数に対して色分けをしたい場合はaes()内で指定する必要があります。
しかしこのままでは色が非常に見にくいので、色を修正していきます。
ggplot() +
geom_sf(data = fukushima, aes(fill = is_in4cities)) +
geom_sf(data = park_s, color = "darkgreen") +
scale_fill_manual(
values = c("white", "lightblue")
) +
theme_void()
これでより見やすいプロットになりました。scale_fill_manual()では、aes(fill = )で設定した変数に対してvalues =で色を割り当てることができます。
例えば人口など連続変数をマッピングしたい場合はまた別ですが、離散値の場合は基本的にこの方法でプロット可能です。今は2種類しかないのでc("white", "lightblue")ですが、3種類以上でも可能です2。
凡例の整理
図 5 では地図自体は整理できたものの、凡例部分が未整理です。
例えばis_in4citiesという文字は消したいし、TRUEやFALSEの文字も変えたいという場合があるかと思います。
その設定をするコードは以下です。
ggplot() +
geom_sf(data = fukushima, aes(fill = is_in4cities)) +
geom_sf(data = park_s, color = "darkgreen") +
scale_fill_manual(
values = c("white", "lightblue"),
labels = c("対象外", "4都市")
) +
guides(fill = guide_legend(title = NULL, reverse = TRUE)) +
theme_void()
ポイント:
guides()内でfillを指定- これは
aes()内でfillを使用しているため3
- これは
scale_fill_manual()内でlabels =を指定- TRUEやFALSEの代わりに表示したい文字列をベクトルで指定
guide_legend()内でtitle = NULLを指定- 文字通りタイトルを空にする
guide_legend()内でreverse = TRUEを指定- 要素の順を逆転させる
- デフォルトではTRUEがFALSEの下に来ますが、この場合上に来てほしいので
reverse = TRUEにしています
点を色で塗り分ける
今度は点に色を付ける方法です。これまではオレンジや濃い緑で統一して色を付けてきましたが、これを色分けしていきます。
先ほどと同様、分け方に従って変数を追加します。先ほどと同様の4市に含まれる公園に色を付けるとします。
park_s <- park_s |>
mutate(is_in4cities = name_muni %in% cities)ほとんど同じです。
続いてプロットを行います。
ggplot() +
geom_sf(data = fukushima, fill = "white") +
geom_sf(data = park_s, aes(color = is_in4cities)) +
theme_void()
先ほどとの違いは、aes()内でfillではなくcolorを使っている点です。文字通りfillは塗りつぶしですので、点ではcolorを使います。
ここからは塗りつぶしで行った手順をまとめて行っていきます。
ggplot() +
geom_sf(data = fukushima, fill = "white") +
geom_sf(data = park_s, aes(color = is_in4cities)) +
scale_color_manual(
values = c("lightblue", "darkblue"),
labels = c("対象外", "4都市内")
) +
guides(color = guide_legend(title = NULL, reverse = TRUE)) +
theme_void()
これで点の塗分けも可能になりました。
ポイント:
scale_color_manual(values = )で色を指定- 先ほどは
fillだったが今回はcolorを使っている
- 先ほどは
guides()- 1と同様
color =になっている - 他は塗りつぶしと同じ
- 1と同様
凡例の位置
最後に、凡例の位置はtheme()内で変更可能です。
ggplot() +
geom_sf(data = fukushima, fill = "white") +
geom_sf(data = park_s, aes(color = is_in4cities)) +
scale_color_manual(
values = c("lightblue", "darkblue"),
labels = c("対象外", "4都市内")
) +
guides(color = guide_legend(title = NULL, reverse = TRUE)) +
theme_void() +
theme(
legend.position = "bottom"
)
凡例については他のプロット同じなのでこちらも参照してください。
おわりに
今回は1.5回としてR上での地図のプロットをまとめました。今後の回でまた別タイプのプロットが出てくるかもしれませんが、その都度紹介していきます。
注
CRSについては、5. 座標参照系についてをご覧ください。↩︎
変数が「政令指定都市」、「中核市」、「その他」で
scale_fill_manual( values = c("white", "lightblue", "blue") )とするなど。↩︎例えば折れ線グラフで
linetypeを使っていたら、ここもlinetype =になります。↩︎