Rで計画停電に従って地図を塗り分ける


ようやく本題ということで計画停電のグループに沿って地図を塗り分けます。
大田区でそのままやろうと思っていたのですが、大田区は今計画停電の対象ではない。
ということで対象地域が多い八王子市に変えました。

今日は八王子市のデータを前回と同様にe-statからダウンロードしてきたものとします。

library(maptools)
library(plyr)
map <- readShapePoly("hachi.shp")

計画停電のデータも東京電力のサイトからダウンロードしてきてcsvにするなりなんなりして読み込み、列名を自分が使いやすいようにいったん変換します。
なお、計画停電のグループは同じ町名であっても二つグループが割り当てられていたりするのでそういった町については適当な処理(今回は平均することで他のグループで区別しています)を加え、重複を無くします。

teiden <- read.csv("tokyo.csv")
colnames(teiden) <- c("pref", "ku","name","group")
teiden <- ddply(teiden, .(pref, ku, name), summarise, group=mean(group))#グループに重複があるのでフラグをつけ直す


さて、要は前回の人口データが計画停電のグループに置き換わればうまく塗り分けられるということで、市区名と町名でもってmergeします。
今回作業している環境がmacである都合上、文字コードの変換をいったん行っていますが、windowsの場合は不要かもしれません。

map@data$MOJI <- iconv(map@data$MOJI, from="CP932", to="UTF-8")
map@data$GST_NAME <- iconv(map@data$GST_NAME, from="CP932", to="UTF-8")
map@data <- merge(map@data, teiden, by.x=c("GST_NAME", "MOJI"), by.y=c("ku", "name"))

データがこれで完成したのでプロットします。
spplotはlatticeグラフィックであり、通常のplot関数と異なるため、text関数で文字を上書きしたりできません。
したがって、sp.layout引数に文字列(今回は町名)と文字列の座標(coordinatesで取得)を指定することで文字列をプロットします。
また、今回の環境(mac)ではそのままプロットすると日本語が表示されないので、fontfamilyで指定しておきます。

l <- list("sp.text", coordinates(map), map@data$MOJI)
trellis.par.set(grid.pars=list(fontfamily="HiraKakuProN-W3"), list(fontsize=list(text=5)))
spplot(map, zcol="group", sp.layout=l)

ということで以下のようにプロットできました。
データさえうまくmergeできればプロットは簡単ですのでぜひお試しあれ。

今日のコードは以下の通り。

library(maptools)
library(plyr)
map <- readShapePoly("hachi.shp")

teiden <- read.csv("tokyo.csv")
colnames(teiden) <- c("pref", "ku","name","group")
teiden <- ddply(teiden, .(pref, ku, name), summarise, group=mean(group))#グループに重複があるのでフラグをつけ直す

map@data$MOJI <- iconv(map@data$MOJI, from="CP932", to="UTF-8")
map@data$GST_NAME <- iconv(map@data$GST_NAME, from="CP932", to="UTF-8")
map@data <- merge(map@data, teiden, by.x=c("GST_NAME", "MOJI"), by.y=c("ku", "name"))

l <- list("sp.text", coordinates(map), map@data$MOJI)
trellis.par.set(grid.pars=list(fontfamily="HiraKakuProN-W3"), list(fontsize=list(text=5)))
spplot(map, zcol="group", sp.layout=l)