Rで描いた地図に方位記号を追加する方法

この記事では、Rで描いた地図に方位記号を追加する方法について説明します。

方位記号

記事の概要です。

  1. 方位記号を追加するためにggsnパッケージをインストールします。

  2. 茨城県の地図を作成します。

  3. ggsnパッケージのnorth2関数を使い、方位記号を追加します。

方位記号を追加する部分です。

## 方位記号を追加
north2(ibaraki,
       x = .825,     # 横方向の位置(0-1)
       y = .5,       # 縦方向の位置(0-1)
       scale  = .15, # 方位記号のサイズ(0-1)
       symbol = 3)   # 方位記号の種類(1-18)

こちらはソースコード全体です。

## シェープファイルとCSVファイルを結合

library(sf)
shp <- st_read("./data/N03-20150101_08_GML", options = "ENCODING=SHIFT-JIS")

d <- read.csv("./data/kekkahyo1_ibaraki_2015-2045.csv")

library(dplyr)
shpCsv <- left_join(shp, d, by = c("N03_004" = "市区町村"))

## 2020年の推計人口を、3グループ(増加、横ばい、減少)に分ける

x <- shpCsv$cy2020
xGrp <- case_when(x >= 102 ~ "増加",
                  x >= 98 & x < 102 ~ "横ばい",
                  x < 98 ~ "減少",
                  TRUE ~ NA_character_) # グループ化
xGrp <- factor(xGrp, levels = c("増加", "横ばい", "減少")) # 順序(≠大小関係)を設定
shpCsv$cy2020Grp <- xGrp # cy2020Grpカラムに格納

## 描画

library(ggplot2)
ibaraki <- ggplot(shpCsv) + geom_sf(aes(fill = cy2020Grp)) +
    scale_fill_manual("2020年の推計人口", values = c("#fb9a99", "#ffffff", "#a6cee3")) +
    theme(legend.position = c(0.2, 0.8)) # 左下は 0, 0、右上は 1, 1


## スケールーバーを追加
library(ggsn)
ibaraki <- ibaraki + scalebar(shpCsv,           # シェープファイル
                              dist      = 15,   # 1メモリが表す距離
                              dist_unit = "km", # 距離の単位
                              transform = TRUE, # 地図の座標が緯度・経度の場合TRUE
                              model     = "GRS80", # 楕円体モデル。シェープファイルに依存。
                              location  = "bottomleft") # "topright", "bottomright", "bottomleft", "topleft"

ibaraki # 方位記号なしで描画

## 方位記号を追加
north2(ibaraki,
       x = .825,     # 横方向の位置(0-1)
       y = .5,       # 縦方向の位置(0-1)
       scale  = .15, # 方位記号のサイズ(0-1)
       symbol = 3)   # 方位記号の種類(1-18)

## 方位記号一覧
northSymbols()

この記事で使用したRとパッケージのバージョンを記載しておきます。

  • R 3.6.1

  • sf 0.7-6

  • dplyr 0.8.3

  • ggplot 3.2.0

  • ggsn 0.5.0

準備:ggsnパッケージのインストール

ggsnパッケージをインストールします。

このパッケージにつては、こちらで簡単に説明しています。

インストールの仕方は、こちらを参考にして下さい。

準備:茨城県の地図を作成

方位記号を追加する地図を作成します。

作成するのは、こちらの記事で作成した、スケールバー付きの地図です。

以下にソースコードを示します。
記事とこのソースコードを基に、地図をibarakiに代入して下さい。

## シェープファイルとCSVファイルを結合

library(sf)
shp <- st_read("./data/N03-20150101_08_GML", options = "ENCODING=SHIFT-JIS")

d <- read.csv("./data/kekkahyo1_ibaraki_2015-2045.csv")

library(dplyr)
shpCsv <- left_join(shp, d, by = c("N03_004" = "市区町村"))

## 2020年の推計人口を、3グループ(増加、横ばい、減少)に分ける

x <- shpCsv$cy2020
xGrp <- case_when(x >= 102 ~ "増加",
                  x >= 98 & x < 102 ~ "横ばい",
                  x < 98 ~ "減少",
                  TRUE ~ NA_character_) # グループ化
xGrp <- factor(xGrp, levels = c("増加", "横ばい", "減少")) # 順序(≠大小関係)を設定
shpCsv$cy2020Grp <- xGrp # cy2020Grpカラムに格納

## 描画

library(ggplot2)
ibaraki <- ggplot(shpCsv) + geom_sf(aes(fill = cy2020Grp)) +
    scale_fill_manual("2020年の推計人口", values = c("#fb9a99", "#ffffff", "#a6cee3")) +
    theme(legend.position = c(0.2, 0.8)) # 左下は 0, 0、右上は 1, 1


## スケールーバーを追加
library(ggsn)
ibaraki <- ibaraki + scalebar(shpCsv,           # シェープファイル
                              dist      = 15,   # 1メモリが表す距離
                              dist_unit = "km", # 距離の単位
                              transform = TRUE, # 地図の座標が緯度・経度の場合TRUE
                              model     = "GRS80", # 楕円体モデル。シェープファイルに依存。
                              location  = "bottomleft") # "topright", "bottomright", "bottomleft", "topleft"

一旦、方位記号なしで描画してみましょう。

ibaraki # 方位記号なしで描画
茨城県の地図(方位記号なし)

方位記号の追加

では、方位記号を追加します。

方位記号の追加には、ggsnパッケージのnorth2関数を使います。

## 方位記号を追加
north2(ibaraki,
       x = .825,     # 横方向の位置(0-1)
       y = .5,       # 縦方向の位置(0-1)
       scale  = .15, # 方位記号のサイズ(0-1)
       symbol = 3)   # 方位記号の種類(1-18)

実は、”north“という関数でも方位記号を追加できます。
しかし、位置の選択肢が、“topright” (default), “bottomright”, “bottomleft” and “topleft” の4つしかないため、今回は使用しませんでした。

使い方は、

?north

を実行するとヘルプが表示されるので、気になる方はご覧になって下さい。

また、方位記号は全部で18種類あります。

## 方位記号一覧
northSymbols()
ggsnパッケージで使える方位記号一覧

以下の地図が表示されれば、完了です。

茨城県の地図(方位記号あり)

おわりに

お疲れさまでした。
地図の背景を”なし”(ブランクテーマ)にすると、より本格的になりそうですね。
ggsnのblank関数で実現できるので、試してみて下さい。

いいなと思ったら応援しよう!