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はこのように、簡単に処理を追加したり減らしたりできるので、とても重宝します。
以下のグラフが表示されれば、完成です。
![](https://assets.st-note.com/img/1678375701174-AqPL9HZwvy.png?width=1200)
おわりに
お疲れさまでした。
QGISに比べると大変ですね。
でも、その分柔軟な処理が可能です。
あと、データセットさえ作れればあとは割と楽である点、そこを押さえていただければと思います。