地図をいじりたい

やりたいこと

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.