見出し画像

Rを使って地図上にデータをプロットする (leaflet 編)

はじめに

こんなときありませんか・・・?

  • サンプリング地点を示したい

  • 測定値の水平分布を示したい

  • 移動経路を示したい

こんなイメージ

Google マップや白地図に手作業でピンを打つこともできますが、なかなか面倒な作業ですよね・・・。
そこで、Rの出番です。
今回はleafletパッケージを使った方法を紹介します。

やってみよう

Data File

Map_01.csv の例

基本的な構成は「地点名 (St)、緯度 (lat)、経度 (lng)」です。
"Map_01.csv" と名前をつけて保存します。

基本的なコード

library(leaflet)

df <- read.csv("Map_01.csv") 

m <- leaflet(df) %>% 
  addTiles() 

m %>%
  addCircleMarkers(~lng, ~lat)

解説

#1 library(leaflet) で、ライブラリーを呼び出します。
leaflet package をインストールしていない場合は、以下のコードを実行してください。

install.packages("leaflet")

#2 read.csv() で、データファイルを読み込みます。 
読み込んだデータファイルは、ひとまず "df" という「箱」に格納しておきます。

#3 データファイル"df"を leaflet () に入れて、leaflet オブジェクトを作ります。
さらに、addTiles() 関数で、地図のタイルを指定します 。
これらのオブジェクトを"m" という箱に格納しておきます。

#4 addCircleMarkers() 関数で、指定の地点にマーカーを付けます。
関数のルールは、addCircleMarkers(~経度, ~緯度) です。
緯度・経度のデータは、以下のように直接入力してもOKです。

m %>%
  addCircleMarkers(~c(135.9056),~c(35.06202))

しかし、地点数が多いとき、データを直接入力していると発狂してしまうでしょう。
そこで、あらかじめデータファイル(今回であれば"df") で「経度 =lng」列と「緯度 =lat」列を作成しておき、
addCircleMarkers() を実行する際に「lng」列と「lat」列を指定する方法をとりました。

なお、leaflet では "%>%" を使って複数の命令を組み合わせます。

カスタマイズする

ポイントの色を変えてみよう

addCircleMarkers() 内の color でポイントの色を指定します。

m %>%
  addCircleMarkers(~lng, ~lat, color = "Red")

color = "" の中は、単語(red, blue, blackなど)でもOKですし、
カラーコード(#CD5C5C, #ADFF2F, #FFF8DCなど)でもOKです。

現在のプロットは「透明色の円+太い輪郭」に見えますが、
fillColor = "" -> 塗りつぶしの色
stroke = "" -> 輪郭の有無 (T or F で指定)
fillOpacity = "" -> 透明度(範囲は0~1; 数字が小さいほど透明度が高い)
radius = "" -> ポイントの大きさ (数字で指定)
で、さらにカスタマイズ可能です。

たとえば、以下のコードを走らせてみます。

m %>%
  addCircleMarkers(~lng, ~lat, fillColor = "Red",
                   color = "Black",
                   fillOpacity = 1,
                   stroke = T)

ポイントの種類を変えてみよう

addPopups() を使って、指定の地点に文字つきのピンを打つことができます。

m %>%
  addPopups(~lng, ~lat, popup = df$St)

addPopups() を使うときは、popup を指定する必要があります。
また、popup = "" で指定するデータは、文字列が好ましいです。
今回は、データファイルの「地点名 (=St)」を指定しました。

地図の種類を変えてみよう

leaflet では、自由に地図タイルを変更することができます。
(デフォルトではOpenStreetMapです)

m <- leaflet(df) %>% 
  addProviderTiles("Stamen.Toner")

leaflet オブジェクトを作成する際に、addProviderTiles() で地図タイルを指定します。
(デフォルトでは"addTiles()"だった箇所を変更します)
今回は "Stamen.Toner" というマップタイルを使ってみますが、ほかにもたくさんの種類のマップタイルがあります。
leaflet で使用可能なマップタイルについては、以下のサイトから探してみてください。

上記のデモサイトの操作方法についてかんたんに説明します。
画面右側のマップの中から好きなマップを選択します。
すると、画面上方に leaflet-providers preview という Box が出てきます。 

Box 中段にある Provider names for leaflet-providers.js から、
タイル名をコピーし、addProviderTiles() の中に貼り付けましょう。
それでは、ためしに以下のコードを実行してみます。

m <- leaflet(df) %>% 
  addProviderTiles("Stamen.Toner")

m %>%
  addCircleMarkers(~lng, ~lat, fillColor = "Red",
                   fillOpacity = 1,
                   stroke = F)


地図の種類が変わりました。

応用編

データに応じてプロットの色を変えてみましょう

  • グループごとにポイントの色をわけたい

  • 濃度に応じて色を変えたい(グラデーション)

それでは、さきほどまで使っていた "Map_01.csv" に少し情報を付け加えます。
地点名 (St)、緯度 (lat)、経度 (lng) に「グループ (group)、濃度 (conc.)」を追加しました。
グループは文字型 (character)、濃度は数値型 (numeric) です。
このデータセットを "Map_02.csv" と名前をつけて保存します。

Map_02.csv の例

グループごとに色を変える

サンプル採取地点を South と North の2グループにわけたとします。
各採取地点がどの場所に位置し、どちらのグループに属するかがひと目でわかるように、地図上にプロットして説明してみましょう。
まずはコードから。

# Basic code #
df <- read.csv("Map_02.csv")

m <- leaflet(df) %>% 
  addTiles() 

# Add color palette #
pal1 <- colorFactor(palette = "YlOrRd", 
                    domain = df$group) 

m %>%
  addCircleMarkers(~lng, ~lat, color = ~pal1(group),
                   fillOpacity = 1,
                   stroke = F)

解説

#1 read.csv() でデータセットを読み込みます。

#2 leaflet オブジェクトを作成します。ここまでは、先ほどの手順と同じです。

#3 colorFactor() でカラーパレットを作成します。
colorFactor() 内の palette = "" でカラーパレットを指定します。
今回は既存のカラーパレット "YlOrRd" を使いました。
※既存のカラーパレットについては、以下のサイトを参照ください。

カラーパレットは自分で作成することも可能です。
たとえば、以下のように palette = c("色") で好みのカラーパレットを作成します。

pal11 <- colorFactor(palette = c("Blue","Red"), 
                    domain = df$group) 

また、colorFactor() 内で domain = "" の指定も忘れないでください。
今回はグループごとに異なる色を割り当てたいので、domain = df$group (=> データフレーム df の group 列) とします。

#4 addCircleMarkers() 内の color = "" で、先ほど作成したパレットを指定します。
color = "" 内のルールは、~パレット名 (変数) です。
ということで、今回は ~pal1(group) としました。

濃度によって色を変える (グラデーション)

各地点における濃度を地図上にプロットして、水平分布を見てみましょう
まずはコードから。

pal2 <- colorNumeric(palette = "YlOrRd", 
                    domain = df$conc.) 

m %>%
  addCircleMarkers(~lng, ~lat, color = ~pal2(conc.),
                   fillOpacity = 1,
                   stroke = F)

解説

#1 データファイルは先ほどと同じものを使います。

#2 colorNumeric() でカラーパレットを作成します。
さきほどは colorFactor() を使いましたが、今回使う濃度データは数値型であるため、colorNumeric() を使います。
palette = "" および domain = "" の指定方法は、 colorFactor() と同様です。

#3 addCircleMarkers() 内の color = "" で、先ほど作成したパレットを指定します。
color = "" 内のルールは、前回同様です。(同じ関数なので当たり前ですが・・・)

凡例をつける

濃度とカラーの対応がわかるように、凡例をつけてみましょう。

m %>%
  addCircleMarkers(~lng, ~lat, color = ~pal2(conc.),
                   fillOpacity = 1,
                   stroke = F) %>%
  addLegend(position='bottomright', pal = pal2, values = ~conc.)

addLegend() で先ほどまでの図に凡例を付け足すことができます。
position = "" で凡例の位置を指定します。bottomright のほかにも、 bottomleft, topright, topleft などがあります。
pal = でパレットを指定します。
values = ~ で変数を指定します。

今回はここまでです。
次回は、ggmapを使った方法をご紹介したいと思います。

【追記】こちらも参考になるかもしれません

この記事が気に入ったらサポートをしてみませんか?