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

この記事では、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つの問題があります。

  1. 離島・飛び地により、シュープファイルの中に同じ市町村名のデータが複数ある(ラベルが複数地点で表示される)。
  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(無言フォローもお気軽に)

コメント

  1. […] 最後に、地域名を付与します。こちらの記事では複雑なことをしましたが、geom_sf_text (又は、geom_sf_label)関数により、簡単にラベル付けできることが分かりました。 […]

  2. […] この記事では、簡易版の「Rでポリゴンにラベル付けする方法」について説明します。※こちらの記事の改良版です。 […]

  3. […] Rで、ポリゴン(面)へのラベル付け […]

タイトルとURLをコピーしました