Rでポリゴン(面)へのラベル付け

この記事では、Rで、ポリゴンにラベル付けする方法について説明します。

記事の概要です。
前回に引き続き、茨城県の地図に市町村名を表示させます。
まず、読み込んだシェープファイルから、市町村名・ポリゴンデータ(geometry)・市町村の重心の経度(X)・市町村の重心の緯度(Y)のカラムで構成されるデータセットを作ります。
データセットができれば、ほぼ完了です。
地図を描画するときに、geom_text()を追加すれば、各市町村の重心に市町村名が表示されます。

geom_text(aes(x = X, y = Y, label = N03_004), size = 3)

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

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

## データセット作成

library(dplyr)
## 市町村単位でポリゴンをまとめる(融合する)
shpMuni <- shp %>% group_by(N03_004) %>% summarise

## 各市町村の重心座標を求める
center  <- shpMuni %>%
    st_centroid %>%    # 重心計算
    st_coordinates %>% # 経度(X)緯度(Y)を取り出す
    as.data.frame      # 結合するため、データフレーム形式にする

## 市町村のポリゴンに重心座標を結合する
shpMuni <- bind_cols(shpMuni, center)


library(ggplot2)
ggplot(shpMuni) + geom_sf(aes(fill = N03_004))  + theme(legend.position = 'none') +
    geom_text(aes(x = X, y = Y, label = N03_004), size = 3) # 追加

この記事で使用したRとライプラリのバージョンを記載します。

  • R 3.6.1

  • sf 0.7-6

  • ggplot2 3.2.0

準備

データ操作に使うパッケージ「dplyr(でぃーぷらいあー)」をインストールします。

こちらを参考にインストールして下さい。

dplyrは必ずしも必要ではありません。
しかし、Rのデータ操作では、定番中の定番のパッケージです。
ぜひ、インストールしましょう!

データセット作成

方針

ラベル(市町村名)とラベル付けする位置(経度・緯度)がセットになっていれば、ラベルを付けることができます。

しかし、今回使うシェープファイルは下記2つの問題があります。

離島・飛び地により、シュープファイルの中に同じ市町村名のデータが複数ある(ラベルが複数地点で表示される)。
ラベル付けする位置(重心)データがない
そのため、まず、市町村単位でポリンゴンをまとめます。
次に、各市町村の重心座標を求め、市町村単位でまとめたポリンゴンに結合します。

データセットを作成する

茨城県のシェープファイルを読み込みます。
無い方は、こちらを参考にダウンロードして下さい。

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

市町村単位でポリゴンをまとめます。

library(dplyr)
## 市町村単位でポリゴンをまとめる(融合する)
shpMuni <- shp %>% group_by(N03_004) %>% summarise

処理の概要は、group_byのところで市町村(N03_004)単位でグループ化し、summariseでポリゴンを融合しています。

各市町村の重心座標を求めます。

## 各市町村の重心座標を求める
center <- shpMuni %>%
    st_centroid %>%    # 重心計算
    st_coordinates %>% # 経度(X)緯度(Y)を取り出す
    as.data.frame      # 結合するため、データフレーム形式にする

処理の概要は、コメント通りです。

最後に、市町村単位でまとめたポリゴンと重心座標を結合します。

## 市町村のポリゴンに重心座標を結合する
shpMuni <- bind_cols(shpMuni, center)

以上の処理で、ラベル(市町村名)とラベル付けする位置(経度・緯度)が、shpMuniの中でセットになりました。

shpMuniにはその他にも、ポリゴンデータ(geometry)が含まれているので、描画処理をその分シンプルにできますね。

こちらが、shpMuniの中身になります。

# A tibble: 44 x 4
   N03_004                                                  geometry     X     Y
                                          
 1 かすみがうら市~ POLYGON ((140.2125 36.20852, 140.2126 36.2085, 140.2~  140.  36.1
 2 つくばみらい市~ POLYGON ((140.0286 36.04492, 140.0288 36.04491, 140.~  140.  36.0
 3 つくば市    POLYGON ((140.0599 36.23617, 140.06 36.23596, 140.06~  140.  36.1
 4 ひたちなか市~ MULTIPOLYGON (((140.6394 36.39718, 140.6392 36.39708~  141.  36.4
 5 阿見町      POLYGON ((140.2207 36.05514, 140.2211 36.05512, 140.~  140.  36.0
 6 稲敷市      POLYGON ((140.4536 35.99167, 140.4583 35.98583, 140.~  140.  35.9
 7 茨城町      POLYGON ((140.4083 36.34537, 140.4084 36.34537, 140.~  140.  36.3
 8 下妻市      MULTIPOLYGON (((139.9965 36.13203, 139.9964 36.13188~  140.  36.2
 9 河内町      POLYGON ((140.3699 35.91556, 140.3704 35.9147, 140.3~  140.  35.9
10 笠間市      POLYGON ((140.2993 36.44394, 140.2994 36.44393, 140.~  140.  36.4
# ... with 34 more rows

描画

では、描画です。

library(ggplot2)
ggplot(shpMuni) + geom_sf(aes(fill = N03_004))  + theme(legend.position = 'none') +
    geom_text(aes(x = X, y = Y, label = N03_004), size = 3) # 追加

入力データ以外の前回との違いは、geom_textが追加されている点です。
geom_textのところで、Xカラム(経度)とYカラム(緯度)で指定された位置に、N03_004カラムのデータ(市町村名)を表示させています。
ggplotはこのように、簡単に処理を追加したり減らしたりできるので、とても重宝します。

以下のグラフが表示されれば、完成です。

市町村名が表示された茨城県の地図

おわりに

お疲れさまでした。
QGISに比べると大変ですね。
でも、その分柔軟な処理が可能です。
あと、データセットさえ作れればあとは割と楽である点、そこを押さえていただければと思います。

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