Rのプロット領域の角に文字をおきたい

論文のsub figure でAとかBとかを角に置きたいが、角の座標を取得したい。
Rのプロット領域の仕様として、余白 margin と描出されない外領域がある。
box 関数を使うと余白領域または外領域を囲ってくれるが、これは.External.graphics で関数を参照するのを諦めたのでpar 関数で取れる値でゴリ押しする。

まず、plot 関数で呼び出されるプロット領域は、基本的にインチで情報を持っているようである。これは外領域par()$din、余白含めたプロット領域par()$fin、実際にプロットされる領域par()$pin で決まる。
実際にプロットされる領域は、par()$usrで四隅が取得できるが、これはプロット領域の実数、つまりインチではないので、x軸(またはy軸)描出領域を実際にプロットされる領域のインチ表示であるpar()$pinで補正すればなんとかなる。

なんとかした結果がこれである。
f:id:MikuHatsune:20200902151613p:plain

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)
}