地図をいじりたい
やりたいこと
Mapping the World’s Biggest Airlines – Spatial.lyにあるような感じで株価の騰落率でも出そうと思ったんだけど、地理情報(地図情報?)の扱いに不慣れ過ぎていきなりは無理だと判断したので、まずは地図情報系の扱いに慣れて行こうと思った次第。
まずはmapsパッケージからはじめてみる
まずは"maps"パッケージから。これは地図データの処理というよりも”表示”を担当してくれるものっぽい。これのインストール&ロード。
install.packages("maps") library(maps)
日本の描画−1(地方都市含む)
map("world2", "Japan") map.cities(country = "Japan", capitals = 0)
"world2"となっている個所は"world"に変更してもOKだが、こちらの地図の方がやや鮮明になる(環太平洋ゾーンの地図なので)
日本の描画−2(首都のみ)
map("world2", "Japan") map.cities(country = "Japan", capitals = 1)
世界地図
map("world")
ggplot2も併せて使いたい
描画系のパッケージとして(多分)一番有名なggplot2パッケージも地図描画に使えるようなのでいじっておく。
こいつもまずはインストール&ロード。
install.packages("ggplot2") library(ggplot2)
このパッケージを使った描画の基本は
- ggplot関数で下地を作っておいて
- そこにgeom_hogehoge関数を加える
事で最終的なPLOTを得るという事らしい。ggplot2 の自分用メモ集を作ろう - Triad sou.の記事がとてもとても参考になりました。ありがとうございます。
ggplo2に用意されている関数でmapsライブラリに入ってる地図データをdata.frameとして抽出するためにmap_data関数を使う。
> #世界地図のデータをdata.frameとして取得 > world.map <- map_data ("world") > class(world.map) [1] "data.frame" > head(world.map) long lat group order region subregion 1 -133.3664 58.42416 1 1 Canada <NA> 2 -132.2681 57.16308 1 2 Canada <NA> 3 -132.0498 56.98610 1 3 Canada <NA> 4 -131.8797 56.74001 1 4 Canada <NA> 5 -130.2492 56.09945 1 5 Canada <NA> 6 -130.0131 55.91169 1 6 Canada <NA>
この世界のデータから日本のデータだけ抽出して描画。
処理のイメージとしては緯度と経度の列を指定(long, lat)して、group属性によってそのグループ内の点を順にpath関数で結んでいく」という感じかな。
qplot関数を使うといちいち「ggplot() + geom_xxx()」みたいに書かなくて良いから便利。
> japan <- world.map[world.map$region == "Japan",] > qplot(long, lat, data = japan, group = group, geom="path") > #↓でも同じ > #ggplot(japan, aes(x = long, y = lat)) + geom_path(aes(group = group))
上の例では単に線で結んだだけなので、今度はこれを島ごと(group毎)に塗り分けてみる。
groupの値に応じて色を指定して、その色で領域(島)を塗りつぶすようにしてみた(凡例はうざいので非表示・opts関数の箇所)。
> color <- rainbow(length(unique(japan$group))) > names(color) <- unique(japan$group) > qplot(long, lat, data = japan, group = group, fill = color[as.character(group)], geom="polygon") + + opts(legend.position = "none")
うむ、なかなか綺麗だ。
画像をいちいちUPするのが面倒なので、次のR関係の記事からはRPubsを使うようにする予定。
・・・・to be continued.