こんにちは。今回は私が前回leafletで困ったことについてまとめようと思います!
...本題に入ると、メッシュで地図にleafletを使って可視化することについて書いていきます。
##使用環境
r version 3.6.1
rstudio Version 1.2.1335
#使用するデータ
まず緯度経度のデータの場合、メッシュの状態(今回は500mメッシュ)変形してください。
今回はe-statの統計データを使います。
こちらの地図で見る統計(統計GIS)にはすでにメッシュ形式でデータが用意されています。
今回は事業所・企業統計調査の500mメッシュ(4次メッシュ)の2006年の東京都(M5339)のデータを使います。
library(dplyr)
library(rgdal)
library(leaflet)
df<-read.csv("tblT000389H5339.txt",skip = 1) #データ読み込み
colnames(df)<-c("KEY_CODE","事業所数","従業者数") #列名を変える
> head(df)
KEY_CODE 事業所数 従業者数
1 533900043 1 0
2 533900051 2 14
3 533900053 3 27
4 533900071 1 77
5 533900073 1 5
6 533900074 1 2
#shpファイルの読み込み
今度はe-statから境界データをダウンロードします。
地図で見る統計(統計GIS)で境界データの4次メッシュ(500mメッシュ)を選択し、世界測地系緯度経度・Shapefileを選び、M5339をダウンロードしてください。
データをダウンロードするとMESH05339.shx、MESH05339.shp、MESH05339.prj、MESH05339.dbfの四つのファイルがダウンロードされているはずです。
そしてかならずこの四つのファイルをすべて同じ作業ファイルに移してください!
この四つすべてないとデータの読み込みができないので注意してください!
そしてreadOGRで読み込みをし、sp::mergeでデータ結合をしてください。
#データ読み込み
shape <- readOGR("MESH05339.shp",stringsAsFactors = FALSE, encoding = "UTF-8")
#データ結合
shape2<-sp::merge(shape, df2, by="KEY_CODE", all=F,duplicateGeoms = TRUE)
#leafletで地図にプロット
##色の設定
プロットしたいデータが連続した数値データの場合、colorNumeric()を使います。
補足:カテゴリデータの場合はcolorFactor()を使います。
#色の設定
pal <- colorNumeric("Blues", domain = shape2@data$事業所数, reverse=F)
# 地図にプロット
shape2 %>%
leaflet() %>%
# addProviderTiles() : 背景のタイルを指定
addProviderTiles(providers$CartoDB.Positron) %>%
setView(lat = 35.66, lng = 139.76, zoom = 10)%>%
# addPolygons() : 塗り分け地図の描画
addPolygons(fillOpacity = 0.5,
weight=1,
color = "#666",
fillColor = ~pal(shape2@data$事業所数), #ここ変える
) %>%
# addLegend() : 凡例の設定
addLegend(position='bottomright', pal = pal, values = ~事業所数,title = "事業所数")
プロットしてみるとあまりうまくプロットできませんでした。
実際にデータを見てみましょう。(普通は最初にデータ見るとは思いますが・・・)
> summary(df)
KEY_CODE 事業所数 従業者数
Min. :533900043 Min. : 1.00 Min. : 0.0
1st Qu.:533924076 1st Qu.: 9.00 1st Qu.: 79.0
Median :533944624 Median : 29.00 Median : 283.0
Mean :533942295 Mean : 71.96 Mean : 867.3
3rd Qu.:533962984 3rd Qu.: 71.00 3rd Qu.: 748.0
Max. :533977991 Max. :4015.00 Max. :75698.0
やっぱり最大値が以上に高いですね。
色の設定を変えてみましょう。
#カテゴリの設定
df2<-df%>%
dplyr::mutate(flag=ifelse(事業所数<29,0,ifelse(事業所数>=29&事業所数<71,1,ifelse(事業所数>=71&事業所数<500,2,3))))
#データ結合
shape2<-sp::merge(shape, df2, by="KEY_CODE", all=F,duplicateGeoms = TRUE)
#色の設定(本当はもう一色書きますがちょうどいい色が見つからなかったのでこうしました。)
pal <- colorFactor(palette=c("white","skyblue","blue"),shape2@data$flag)
# 地図にプロット
shape2 %>%
leaflet() %>%
# addProviderTiles() : 背景のタイルを指定
addProviderTiles(providers$CartoDB.Positron) %>%
setView(lat = 35.66, lng = 139.76, zoom = 10)%>%
# addPolygons() : 塗り分け地図の描画
addPolygons(fillOpacity = 0.5,
weight=1,
color = "#666",
fillColor = ~pal(shape2@data$flag), #ここ変える
) %>%
# addLegend() : 凡例の設定
addLegend(position='bottomright', pal = pal, values = ~flag,title = "事業所数")
今回は中央値と第三四分位と任意で500でカテゴリとして色の設定をしました。
先ほどよりはうまくできました。
もし、colorNumeric()でプロットする最大の値を変える方法や色をグラデーションにする方法を知っている方がいましたら、教えてもらえると幸いです。
##参考
leafletではじめるRによる地図プロット
チョコレート狂地図leafletバージョン
こちらは英語のサイトですが大変参考になりました。
leaflet for R