次元の海で溺れる

Rとデータ解析と統計手法たちとわたし

【locator,Nippon,TeachingDemo】世界を二つに分けたがる

ヘロヘロプーな感じで生きていると、世の中を

「●●な人」
「●●でない人」

の二つに分けたがるマンに、見事に仕分けられてしまうことがよくある。(ない)


複雑な世の中を二つに分けて論じようなんて傲慢である。
ずるい。私も世界を二つに分けたい。

テーマ

◎日本を二つに分ける。
◎...のは傲慢なので、小さい日本を二つに分ける。

◎分けただけだとつまらないので、その技を何かに応用してみる

とりあえず分けてみる

使ったのは以下のパッケージ。
Nipponパッケージのフォルダ内に含まれているシェープファイルをお借りする。

library(maptools)
library(TeachingDemos)
library(Nippon)

シェープファイルの準備

#Nipponパッケージに使用されているシェープファイルのフルパスを取得
#readShapePolyで読み込み

m <- system.file("shapes/jpn.shp", package = "Nippon")[1] %>% 
  maptools::readShapePoly(., proj4string = CRS("+proj=longlat +datum=WGS84"))

ちなみにJapanPrefecturesMap()で描いてみるとこんな感じの日本である。

Nippon::JapanPrefecturesMap()

f:id:WAFkw:20160131172023p:plain


取得したシェープファイルを描画する。
JapanPrefectureMapでの描画に比べて、沖縄が定位置にある。

plot(m,col=gray(0.8))


f:id:WAFkw:20160131172148p:plain


これをこんな感じで二つに分けたい。

f:id:WAFkw:20160131172507p:plain


(こんな感じ)

そのままぱっかーんてすると罰当たりな感じがするので
もうちょっとささやかな感じで分けたい。

ということで、
ぱっかーんと分けた日本を、サブプロットとして埋め込むことを検討する。


分けたいところの座標を取得

「この辺!!特に何もないけどこの辺で分けたいんだよ!!」

という時は、locator()が便利。

#元のplotをまず描画
plot(m,col=gray(0.8))

#locatorを実行

> locator(2) #2点クリックして座標ゲット
$x
[1] 127.6297 139.5370

$y
[1] 46.78319 29.40000


#plot内のお好きなところの左上、右下をそれぞれクリック。
#座標の取得が出来る。

同様に、埋め込みたいところの座標も取得しておく。

準備が整ったので、
TeachingDemo::subplotで元plotの上に重ねていく。

#元plot
plot(m,col=gray(0.8))

#西日本
subplot({
  plot(m,xlim=c(127,138),ylim=c(30,45),col=gray(0.8))
  box()
},x=c(141.5,145),y=c(30,36.5))

#東日本
subplot({
  plot(m,xlim=c(138,146),ylim=c(30,45),col=gray(0.8))
  box()
},x=c(145.5,149),y=c(30,36.5))

subplotの中はboxで囲んでね!としている。
これで描画するとこんな感じ。


f:id:WAFkw:20160131173432p:plain


ぱっかーん


できた。
いい。いいよ、ささやかだよ。


でもなんかすごい悪いことをした気持ちになる。

やはり世の中の事象を単純にTRUE、FALSEで分けてしまうのはだいそれたことだな、といった感じ。

お茶を濁す

さて、
これをやって終わるわけにはいかないので
これが何に使えるのかについて考える。

分かりやすいのが沖縄なので、沖縄をお好きなところに移動させる。

> plot(m,col=gray(0.8))
> subplot({
+ plot(m,xlim=c(127,130),ylim=c(25,30),col=gray(0.8))
+ box()
+ },x=c(131,133),y=c(39,42))

f:id:WAFkw:20160131174124p:plain


さっきと同じやり方をすると、沖縄が二つに分身してしまう。



これは元plotで沖縄も描画に含んでしまっているからなので、
元plotの方のxlim,ylimで描画範囲を限定してうまいことやる。

plot(m,xlim=c(128,146),ylim=c(30,46),col=gray(0.8)) #沖縄を除く
subplot({
  plot(m,xlim=c(127,130),ylim=c(25,30),col=gray(0.8))
  box()
},x=c(131,133),y=c(39,42))

f:id:WAFkw:20160131174153p:plain


できた。

他のplotでもこんな感じでlocatorで座標取得してよきに指定すれば
便利なことが多々あるかもしれない。

という話。(だったことにする)