ggplot2で地図にプロジェクト参画機関の所在地をプロットする。

#1　はじめに

[前回](https://qiita.com/restructurecore/items/831014d75c599f3cd597)は埼玉県が平成26年度から実施している「先端産業創造プロジェクト」のネットワーク分析を行いましたが、今回は参画機関の所在地を埼玉県の地図にプロットしてみます。
全部だと数が多いので今回は3つほど抽出して行ってみました。

なお、コードなどは全体的にこちらのサイトを参考にさせていただきました。

- [地物としてのCSV読み込み＆描画 | R, GIS](https://misaki-blog.com/190802-r-read-csv-feature/)

#2　埼玉県の地図（シェープファイル）の入手

まず、埼玉県の地図（shapeファイル）を入手する必要があります。
私は以下のサイトを参考にさせていただき、入手しました。

- [QGIS (3.4.8 LTR) でシェープファイルを読み込む方法](https://misaki-blog.com/190615-qgis-read-shp/)

（QGISで読み込む方法も記載されていますが、今回は使わないのでスルーして大丈夫です。）

読み込んだファイルは解凍して、フォルダごと保存しておきます。
（シェープファイルは複数のファイルから構成されますが、これらのファイルが同一ディレクトリにあってデジタル地図として機能します。
私ははじめshpファイルだけ読み込もうとしていたので、正しく読み込むことができませんでした。）
【参考】[Rでシェープファイルを読み込む](https://qiita.com/nozma/items/bf8936df6b3a3882285a)

#3　所在地を記載したcsvファイルの作成

次に、参画機関の所在地の緯度と経度を記載したcsvファイルを用意します。
検索サイトで「ジオコーディング」と検索すると、住所から緯度・経度を表示してくれるサイトがいくつか表示されます。
私は、谷謙二先生の研究室（埼玉大学教育学部人文地理学）のサイトを利用させていただきました。

作ったcsvファイルはこんな感じです。
![スクリーンショット 2019-12-22 8.20.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/a96a2f0b-6201-1a07-c381-48d106e5af6c.png)
とりあえず「saitamageo.csv」というファイル名で保存しました。

ここで注意点が2つあります。
まず、csvファイルの内容に日本語が入っていると以下のエラーメッセージが表示されます。
>警告メッセージ:
read.table(file = file, header = header, sep = sep, quote = quote, で:
入力コネクション 'saitamageo.csv' に不正な入力がありました

自分の場合は、全て英語にすることで回避しました。

また、csvの最終行が改行されていないと以下のエラーメッセージが表示されました。
>警告メッセージ:
read.table(file = file, header = header, sep = sep, quote = quote, で:
incomplete final line found by readTableHeader on 'saitamageo.csv'

自分の場合はテキストエディタ（CotEditor）で開いて最終行で改行（エンターを押下）して保存することで回避しました。

#４　Rで読み込みと描画

続いて、Rでシェープファイルを読み込みます。
読み込みにあたってはsfパッケージとggplot2パッケージが必要ですので、事前にインストールしておく必要があります。

【参考】

- [R学習（2）：国土地理院の地球地図データを使った日本地図の可視化](https://ykogajp.hatenablog.com/entry/2019/03/17/004000)
- [Rでシェープファイルを読み込む](https://qiita.com/nozma/items/bf8936df6b3a3882285a)

インストールしたら、以下のとおり入力します。

```ruby:qiita.R
#shapeファイルの読み込み
library(sf)
shp <- st_read("N03-190101_11_GML", options = "ENCODING=SHIFT-JIS")
#ggplot2で念のため埼玉県の地図を描画してみる。
library(ggplot2)
ggplot(shp) + geom_sf()
```
表示されるまで多少時間がかかるかもしれませんが、埼玉県の地図が表示されます。
![スクリーンショット 2019-12-22 10.33.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/7fac2da8-c0fd-9041-d9a9-e3655079f96f.png)
次に、この地図に参画機関の所在地をプロットします。

```ruby:qiita.R
csv <- read.csv("saitamageo.csv",fileEncoding="UTF-8")
#念のためcsvファイルの中身を確認。
head(csv)
name fX fY
1 k 139.5315 35.81630
2 n 139.7129 36.02540
3 s 139.7116 35.93084
#先ほどの埼玉県の地図に重ねる形で描画。
ggplot(shp) + geom_sf() + geom_point(data = csv, aes(x = fX, y = fY))
```
![スクリーンショット 2019-12-21 22.12.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/4ef4c15c-11f9-ec97-398a-9aa7e2c37936.png)

#５　今後やりたいこと
- 市町村の境界を非表示にする。
- 日本地図に描画してみたい。

諸々不要な情報を削除する方法はこちらのサイトが大変参考になりそうでしたが、自分の能力では市町村の境界の削除の方法がわかりませんでした。

- [Rを使ってシェープファイルから白地図を描く](https://qiita.com/nozma/items/8e890595c07d3be86bc9)

また、日本地図への描画はesriジャパンのHPで提供されている「全国市区町村界データ」を用いてやってみたのですが、ファイルが大きく出力されるまでにかなり時間がかかるうえ、表示もわかりづらい形になってしまいました。

- [全国市区町村界データ](https://www.esrij.com/products/japan-shp/)

![スクリーンショット 2019-12-21 22.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/5473910d-fb1b-f9ad-2632-97c475fd83ba.png)
もっとシンプルな日本地図のシェイプファイルがあれば、そちらでやってみたいと思っています。

##【2020/01/13追記】シンプルな日本地図について
以下の三重大学奥村先生が公開されているファイルが使いやすいと思いました。
読み込みコードは以下の通りです。

- [シェープファイルを読む](https://oku.edu.mie-u.ac.jp/~okumura/stat/shape.html)

```ruby:qiita.R
japan = st_read("https://oku.edu.mie-u.ac.jp/~okumura/stat/data/japan.geojson", stringsAsFactors=FALSE)
```

これで以下の「#6　【2020/01/13追記】ラベルの表示について」に記載のようにラベルを表示して表示するとこんな感じで表示されます。
![スクリーンショット 2020-01-13 12.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/e59f102b-69f8-32e2-1a8f-44afb787cd1e.png)


#6　【2020/01/13追記】ラベルの表示について

プロットしたポイントの付近にラベルをプロットする方法を追記しました。
なお、普通にgeom_text関数を使うとポイントとラベルが重なって見づらいので、ggrepelパッケージを使いました。ggrepelパッケージの詳細は以下のとおりです。

- [ggplot2 パッケージによる可視化の際のラベルの重なりを防ぐ](https://id.fnshr.info/2017/03/19/ggrepel/)

ggrepelパッケージインストール後に、以下のとおり記述します。

```ruby:qiita.R
#ggrepelパッケージを読み込み
library(ggrepel)
#ポイントのプロットのほかに、ラベルのプロットを追記。
ggplot(shp) + geom_sf() + geom_point(data = csv, aes(x = fX, y = fY)) + geom_text_repel(data = csv, aes(x = fX, y = fY, label = name))
```

すると、こんな感じで表示されます。
![スクリーンショット 2020-01-13 12.40.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/9476401f-02c9-7568-d59b-280d1e8bf3d0.png)

【拡大】
![スクリーンショット 2020-01-13 12.34.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149401/5787b5cb-9e19-6528-ea52-9ebc35e75a8d.png)