Rを使って地図上にデータをプロットする (leaflet 編)
はじめに
こんなときありませんか・・・?
サンプリング地点を示したい
測定値の水平分布を示したい
移動経路を示したい
Google マップや白地図に手作業でピンを打つこともできますが、なかなか面倒な作業ですよね・・・。
そこで、Rの出番です。
今回はleafletパッケージを使った方法を紹介します。
やってみよう
Data File
基本的な構成は「地点名 (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" と名前をつけて保存します。
グループごとに色を変える
サンプル採取地点を 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を使った方法をご紹介したいと思います。
【追記】こちらも参考になるかもしれません