この記事では、Rで、ポリゴンにラベル付けする方法について説明します。
※こちらに改良版の記事を書きました(2019-08-07)。
記事の概要です。
前回に引き続き、茨城県の地図に市町村名を表示させます。
まず、読み込んだシェープファイルから、市町村名・ポリゴンデータ(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) # 追加

データセットの作成がポイントです!
また、この記事は、QGISのこちらの記事と対応しています。
この記事で使用した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に比べると大変ですね。
でも、その分柔軟な処理が可能です。
あと、データセットさえ作れればあとは割と楽である点、そこを押さえていただければと思います。
では。
—
YouTube: ミサキさん
問い合わせ先
Mail: caprico.aries@gmail.com
Twitter: https://twitter.com/caprico_aries(無言フォローもお気軽に)
コメント
[…] 最後に、地域名を付与します。こちらの記事では複雑なことをしましたが、geom_sf_text (又は、geom_sf_label)関数により、簡単にラベル付けできることが分かりました。 […]
[…] この記事では、簡易版の「Rでポリゴンにラベル付けする方法」について説明します。※こちらの記事の改良版です。 […]
[…] Rで、ポリゴン(面)へのラベル付け […]