このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

Rのgridパッケージの凄まじい座標系

バイス矩形(ウィンドウの描画領域)とビューポート矩形(仮想的な四角)がある。

いかなる場合でもバイス矩形の座標値の範囲は 0≦x≦1, 0≦y≦1。これは矩形が正方形であることを意味しない。矩形の物理的なアスペクト比にあうように伸縮される。つまり、座標値の領域は [0, 1]×[0, 1]だが、空間側は任意なので、空間におけるx座標とy座標のスケールは異なる。1単位に含まれるピクセル数は縦と横で違う。そして、寸法単位はx軸のスケールに合わせる。概念的には、x軸方向の単位は固定であり、y軸の単位が自由にスケールするが物理的な空間は不変で縦横均質。

原点は左下で、y軸も下から上に向く。もう、なんという非直感的な座標系なんだ。

次がテストに使える。

# 半径0.25の円を描く
circ <- function(x, y, cc=0) {
  col<- if(cc == 0) "black" else "red";  grid.circle(x=x, y=y, r=0.25, gp=gpar(fill=col))
}

複数の点を指定して、それらを順に結ぶ折れ線を描く。Rらしいといえばそうだが、引数は、

  • grid.lines(x座標達のベクトル, y座標達のベクトル)

最初は戸惑う。

axes <- function() {
  # ビューポートに枠を付ける
  grid.rect(gp=gpar(lty="dashed"))
  # 座標軸の十文字と斜め線「/」を描く
  grid.lines(c(0.01, 0.99), c(0.5,  0.5))
  grid.lines(c(0.5,  0.5),  c(0.01, 0.99))
  grid.lines(c(0.01, 0.99), c(0.01, 0.99))
}

とりあえず描く。

library(grid)
axes()
circ(0, 0)

[追記]

どうかしてるぜ!

ビューポート生成時の仕様は、viewport(x=x, y=y, width=w, height=h) だが、想像を絶する引数。

  • xは新しいビューポートの中心(左下や右上ではない、矩形の中心位置)の親座標系によるx座標。
  • xは新しいビューポートの中心の親座標系によるy座標。
  • widthは新しいビューポートの幅の親矩形の幅との比率
  • heightは新しいビューポートの高さの親矩形の高さとの比率

それにも関わらず、マニュアルの説明は:

x 	
A numeric vector or unit object specifying x-location.

y 	
A numeric vector or unit object specifying y-location.

width 	
A numeric vector or unit object specifying width.

height 	
A numeric vector or unit object specifying height.

ほんとうにありがとうございます。

どうしたらこんなふうになるんだ? 信じられない。