この回答は、主に @java_xof によるコメントへの返信です。返信が長すぎてコードが含まれているため、コメントに収まりません。ただし、元の質問にも役立つ場合があります(または少なくとも出発点を提供します)。
関数とそれを使用するコードを次に示します (tcltk および tkrplot パッケージが必要です)。
library(ggplot2)
library(tkrplot)
TkPlotLocations <- function(FUN) {
require(tkrplot)
cl <- substitute(FUN)
replot <- function() eval(cl)
tt <- tktoplevel()
img <- tkrplot(tt, replot, vscale=1.5, hscale=1.5)
tkpack(img)
tkpack(xfr <- tkframe(tt), side='left')
tkpack(yfr <- tkframe(tt), side='left')
xndc <- tclVar()
yndc <- tclVar()
xin <- tclVar()
yin <- tclVar()
tkgrid(tklabel(xfr, text='x ndc'), tklabel(xfr, textvariable=xndc))
tkgrid(tklabel(yfr, text='y ndc'), tklabel(yfr, textvariable=yndc))
tkgrid(tklabel(xfr, text='x inch'), tklabel(xfr, textvariable=xin))
tkgrid(tklabel(yfr, text='y inch'), tklabel(yfr, textvariable=yin))
iw <- as.numeric(tcl("image","width", tkcget(img, "-image")))
ih <- as.numeric(tcl("image","height",tkcget(img, "-image")))
cc <- function(x,y) {
x <- (as.real(x)-1)/iw
y <- 1-(as.real(y)-1)/ih
c(x,y)
}
mm <- function(x, y) {
xy <- cc(x,y)
tclvalue(xndc) <- xy[1]
tclvalue(yndc) <- xy[2]
tclvalue(xin) <- grconvertX(xy[1], from='ndc', to='inches')
tclvalue(yin) <- grconvertY(xy[2], from='ndc', to='inches')
}
tkbind( img, "<Motion>", mm)
invisible()
}
x <- runif(25)
y <- rnorm(25, x, 0.25)
plot(x,y)
par()$pin
par()$plt
TkPlotLocations(plot(x,y))
qplot(x,y)
par()$pin
par()$plt
TkPlotLocations(print(qplot(x,y)))
qplot(x,y) + xlab('Multi\nline\nx\nlabel')
par()$pin
par()$plt
TkPlotLocations(print(qplot(x,y) + xlab('Multi\nline\nx\nlabel')))
上記の関数を定義し、次の行を実行すると、同じランダム データの 3 つのプロットが生成されます。par()$pin
およびpar()$plt
(およびその他のパラメーター) の結果は、プロット領域がプロットで異なっていても、3 つのプロットでまったく同じであることがわかります。
また、3 つの新しいウィンドウがポップアップ表示されます。ウィンドウでは、マウス ポインターをグラフ上に移動できます。ウィンドウの下部には、ポインターの現在の位置が正規化されたデバイス座標とインチで表示されます (両方ともデバイス領域の左下隅)。マウス ポインターをグラフの隅 (またはその他の部分) に合わせると、値が表示され、3 つのグラフを比較できます。
これは、元の質問の少なくとも一部に答えるのに十分かもしれません(プログラム的にではなく、より便利です)。関数を変更して、他の測定値も印刷することができます。他の人が興味を持っている場合は、これを拡張して将来パッケージに含めることができます。