这个答案主要是回复@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 个相同随机数据的图。您可以看到 3 个图的par()$pin
和par()$plt
(和其他参数)的结果完全相同,即使图中的绘图区域不同。
还会弹出 3 个新窗口,在这些窗口中,您可以将鼠标指针移到图形上,在窗口底部,您将看到指针的当前位置,以标准化设备坐标和英寸为单位(均来自设备区域的左下角)。您可以将鼠标指针悬停在图形(或任何其他部分)的角上以查看值并在 3 个图形之间进行比较。
这可能足以回答至少部分原始问题(只是不是以编程方式,这会更有用)。也可以修改该功能以打印出其他测量值。如果其他人有兴趣,我可能会扩展它并将其包含在将来的包中。