数値に基づくポリゴンの色分け(式による分類) | R, GIS

この記事では、Rで、式を使って数値を分類し、ポリゴンを色分けする方法について説明します。

記事の要点です。

  • 処理の流れ:シェープファイルとCSVファイルを結合 -> 数値をグループ分け -> 描画

  • 式を使ったグループ分けは、dplyrのcase_when関数を使う

  • factor関数でグループの順序(≠大小関係)を設定する

プログラム全体を示します。

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

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

d <- read.csv("./data/csv_only/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)
ggplot(shpCsv) + geom_sf(aes(fill = cy2020Grp)) +
    scale_fill_manual(values = c("#fb9a99", "#ffffff", "#a6cee3")) # 各グループの色を設定

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

  • R 3.6.1

  • sf 0.7-6

  • dplyr 0.8.3

  • ggplot 3.2.0

数値に基づくポリゴンの色分け(式による分類)

CSVデータをシェープファイルに結合

こちらを参考にCSVデータをシェープファイルに結合します。

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

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

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

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

色分けに使う値(2020年の推計人口)の式による分類

茨城県にある各市町村の2020年推計人口を式で分類します。

QGISの記事と対応づける為、2020年の人口が2015年の人口の

  • 102%以上 → 「増加」

  • 98%以上 102%未満 → 「横ばい」

  • 98%未満 → 「減少」
    というルールで、市町村を色分けします。

まず、dplyrのcase_when関数を使って、2020年推計人口を3グループに分けます。

x <- shpCsv$cy2020
xGrp <- case_when(x >= 102 ~ "増加",
                  x >= 98 & x < 102 ~ "横ばい",
                  x < 98 ~ "減少",
                  TRUE ~ NA_character_) # グループ分け

case_whenのところでは、各市町村の2020年推計人口一つ一つ(x)に対して、式を満たしたときに、対応する文字列(”増加”、”横ばい”、”減少”)を返しています。
欠損値のように、xがどの式も満さない場合は、欠損値(NA_character_)を返しています。

次に、グループの順序を設定します。

xGrp <- factor(xGrp, levels = c("増加", "横ばい", "減少")) # 順序(≠大小関係)を設定

こうすることで、描画したときの凡例の順序が、“増加”、”横ばい”、”減少”の順になります。
少し発展的な内容ですが、大小関係は設定していません(つまり、増加 > 横ばい などの式は評価できない)。

最後に、グループ分けした結果を、シェープファイルのcy2020Grpカラムに格納します。

shpCsv$cy2020Grp <- xGrp # cy2020Grpカラムに格納

いつものことながら、このようにデータセットができれば、ほぼ完了です。

描画

描画します。

library(ggplot2)
ggplot(shpCsv) + geom_sf(aes(fill = cy2020Grp)) +
    scale_fill_manual(values = c("#fb9a99", "#ffffff", "#a6cee3")) # 各グループの色を設定

各グループの色はQGISで使ったのと同じ色を使っています。
順序を設定したので、“#fb9a99”, “#ffffff”, “#a6cee3″はそれぞれ、”増加”、”横ばい”、”減少”の色に対応しています。

また、市町村名の表示は、プログラムが複雑になるので行ないません。

以下のような地図が表示されれば完成です。


茨城県の2020年の推計人口(2015年と比較)

おわりに

お疲れさまでした。
数値のグループ分けに慣れると、Rの方がQGISよりも簡単かも知れませんね。

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