論文のsub figure でAとかBとかを角に置きたいが、角の座標を取得したい。
Rのプロット領域の仕様として、余白 margin と描出されない外領域がある。
box
関数を使うと余白領域または外領域を囲ってくれるが、これは.External.graphics
で関数を参照するのを諦めたのでpar
関数で取れる値でゴリ押しする。
まず、plot
関数で呼び出されるプロット領域は、基本的にインチで情報を持っているようである。これは外領域par()$din
、余白含めたプロット領域par()$fin
、実際にプロットされる領域par()$pin
で決まる。
実際にプロットされる領域は、par()$usr
で四隅が取得できるが、これはプロット領域の実数、つまりインチではないので、x軸(またはy軸)描出領域を実際にプロットされる領域のインチ表示であるpar()$pin
で補正すればなんとかなる。
なんとかした結果がこれである。
xs <- c("pin"=10, "fin"=80) pt.cex <- 3 text.cex <- 1.5 par(oma=c(2, 3, 4, 1), font=2, xpd=TRUE) xl <- c(0, 100) plot(1, type="n", xlim=xl, xlab="", ylab="mgp[1]") for(z in list(c(1,3), c(2, 3), c(1, 4), c(2, 4))){ points(par()$usr[z[1]], par()$usr[z[2]], col="white", pch=15, cex=pt.cex) text(par()$usr[z[1]], par()$usr[z[2]], sprintf("usr[%d, %d]", z[1], z[2]), xpd=TRUE, font=2, col="red", cex=text.cex) } box("figure", lty=3) box("outer", lwd=15, col=4) segments(xs["pin"], par()$usr[3], y1=par()$usr[4], lwd=3) points(xs["pin"], mean(par()$usr[3:4]), col="white", pch=15, cex=pt.cex) text(xs["pin"], mean(par()$usr[3:4]), "pin", col="red", cex=text.cex) y0 <- par()$usr[4]+diff(par()$usr[3:4])/par()$pin[2]*par()$mai[3] y1 <- par()$usr[4] segments(xs["fin"], y0, y1=y1, lwd=3) points(xs["fin"], mean(c(y0, y1)), col="white", pch=15, cex=pt.cex) text(xs["fin"], mean(c(y0, y1)), "fin", col="red", cex=text.cex) y0 <- par()$usr[3]-diff(par()$usr[3:4])/par()$pin[2]*par()$mai[1] y1 <- par()$usr[3] segments(xs["fin"], y0, y1=y1, lwd=3) points(xs["fin"], mean(c(y0, y1)), col="white", pch=15, cex=pt.cex) text(xs["fin"], mean(c(y0, y1)), "fin", col="red", cex=text.cex) x0 <- par()$usr[1]-diff(par()$usr[1:2])/par()$pin[1]*par()$mai[2] x1 <- par()$usr[2]+diff(par()$usr[1:2])/par()$pin[1]*par()$mai[4] segments(x0, y0, x1, lwd=3) text(mean(c(x0, x1)), y0, "din is ourter and fin is figure inch", pos=3, col="red", cex=text.cex) y0 <- par()$usr[4]+diff(par()$usr[3:4])/par()$pin[2]*par()$mai[3] x0 <- par()$usr[1]-diff(par()$usr[1:2])/par()$pin[1]*par()$mai[2] text(x0, y0, "A", adj=c(0, 1), cex=3) y0 <- par()$usr[3]-diff(par()$usr[3:4])/par()$pin[2]*par()$mai[1] x0 <- par()$usr[1]-diff(par()$usr[1:2])/par()$pin[1]*par()$mai[2] text(x0, y0, "B", adj=c(0, 0), cex=3) x1 <- par()$usr[2]+diff(par()$usr[1:2])/par()$pin[1]*par()$mai[4] text(x1, y0, "C", adj=c(1, 0), cex=3) y0 <- par()$usr[4]+diff(par()$usr[3:4])/par()$pin[2]*par()$mai[3] text(x1, y0, "D", adj=c(1, 1), cex=3) for(i in -1:8){ mtext(sprintf("line=%d", i), side=3, line=i) mtext(sprintf("line=%d", i), side=2, line=i, adj=0.2) }