Rで作った地図に統計情報を載せたい
アメリカの犯罪者状況を可視化したい
Rのデフォルトで使えるデータフレームで,
アメリカの州別の暴力犯罪発生率が入っているものがあります.
>data(USArrests) >head(USArrests) Murder Assault UrbanPop Rape Alabama 13.2 236 58 21.2 Alaska 10.0 263 48 44.5 Arizona 8.1 294 80 31.0 Arkansas 8.8 190 50 19.5 California 9.0 276 91 40.6 Colorado 7.9 204 78 38.7
アメリカの各州で, 人口10万人に対して何人が逮捕されているかを表しています.
暴行(Assault)件数が多いですね. 怖い.
このデータを, アメリカの地図上に表してみたいです.
州別に色分けして, 危険なところの色が濃くなるようにします.
地図を描くときには, map_data("states") を利用します.
前回も使いました.
> library(ggplot2) > head(map_data("state")) long lat group order region subregion 1 -87.46201 30.38968 1 1 alabama <NA> 2 -87.48493 30.37249 1 2 alabama <NA> 3 -87.52503 30.37249 1 3 alabama <NA> 4 -87.53076 30.33239 1 4 alabama <NA> 5 -87.57087 30.32665 1 5 alabama <NA> 6 -87.58806 30.32665 1 6 alabama <NA>
地図を描くだけなら, このmap_data("state")だけでいけます.
これも前回と同じです.
states <- map_data("state") q <- ggplot() q <- p + geom_polygon(data = states, aes(x=long, y=lat, group=group), fill = "orange", colour="black") q
この地図に, 犯罪発生率の情報を載せます.
データフレームの準備
USArrestsとmap_data("state")の2つのデータフレームをマージします.
# 地図の情報 Total <- map_data("state") # 犯罪者の情報 data(USArrests) # マージの準備 州の名前でマージしたい regionvec <- rownames(USArrests) # 大文字小文字を合わせる USArrests$region <- tolower(regionvec) # regionに注目してマージする Total <- merge(Total, USArrests, by="region")
マージして得られたデータフレームはこんな感じです.
>head(Total) region long lat group order subregion Murder Assault UrbanPop Rape 1 alabama -87.46201 30.38968 1 1 <NA> 13.2 236 58 21.2 2 alabama -87.48493 30.37249 1 2 <NA> 13.2 236 58 21.2 3 alabama -87.95475 30.24644 1 13 <NA> 13.2 236 58 21.2 4 alabama -88.00632 30.24071 1 14 <NA> 13.2 236 58 21.2 5 alabama -88.01778 30.25217 1 15 <NA> 13.2 236 58 21.2 6 alabama -87.52503 30.37249 1 3 <NA> 13.2 236 58 21.2
位置情報に犯罪者のデータが合併されたデータフレームになっています.
このデータフレームをggplotでなんやかんやします.
ggplotでなんやかんや
Murderの発生率を描いてみます.
p <- ggplot() p <- p + geom_polygon(data=Total, aes(x=long, y=lat, group = region, fill=Total$Murder), # 塗りつぶしをMurderで colour="black") p <- p + scale_fill_continuous(low = "white", high = "darkred", guide="colorbar") # 色の設定 p
ちゃんと色分けできています.
aes()の中身の, fill= ... のところで塗りつぶしの色を決めます.
塗りつぶしの色を何によって決めるか...だけを指定すればOKです.
つぎはAssault
p <- ggplot() p <- p + geom_polygon(data=Total, aes(x=long, y=lat, group = region, fill=Total$Assault), # 塗りつぶしをAssaultで colour="black") p <- p + scale_fill_continuous(low = "white", high = "darkred", guide="colorbar") # 色の設定 p
最後にRape. 気になります.
p <- ggplot() p <- p + geom_polygon(data=Total, aes(x=long, y=lat, group = region, fill=Total$Rape), # 塗りつぶしをRapeで colour="black") p <- p + scale_fill_continuous(low = "white", high = "darkred", guide="colorbar") # 色の設定 p
...どうやって解釈していいのか. 下のほうが怖いみたいですね. 知りませんけど.
まとめ
地図に統計情報を載せるときには,
何かの統計情報と, 地図情報map_data()とを場所を軸にしてマージ.
ggplotで色指定すればOK.
2013年9月25日追記
地図を見ると謎の線が沢山入っていますね...
原因を調査中です.