更新
(我将保留上面的先前答案,但根据您的评论,这种更程序化的方式更好。)
诀窍在于知道如何从"用户"坐标转换为总体设备的坐标。这可以通过grconvertX
和*Y
来完成。我在这里制作了一些粗糙的辅助函数,尽管它们几乎是不必要的。
user2ndc <- function(x, y) {
list(x = grconvertX(x, 'user', 'ndc'),
y = grconvertY(y, 'user', 'ndc'))
}
ndc2user <- function(x, y) {
list(x = grconvertX(x, 'ndc', 'user'),
y = grconvertY(y, 'ndc', 'user'))
}
为了避免神奇数字出现在代码中,我会预先定义你关注的点:
pointfrom <- list(x = 1.2, y = 1.2)
pointto <- list(x = 18, y = 18)
在图表仍然有效时,将'user'
转换为'ndc'
非常重要;一旦从图表1切换到2,坐标就会改变。
layout( matrix( 1:2 , nrow=2 ) )
图 1。
plot( x=c(1,2) , y=c(1,2) , main="Plot 1" )
points(y~x, data=pointfrom, pch=16, col='red')
ndcfrom <- with(pointfrom, user2ndc(x, y))
绘制2。
plot( x=c(10,20) , y=c(10,20) , main="Plot 2" )
points(y~x, data=pointto, pch=16, col='red')
ndcto <- with(pointto, user2ndc(x, y))
我之前做过的事情(在这里远下面),是重新映射下一个绘图命令将发生的区域。在幕后,layout
做了像这样的事情。(可以使用一些巧妙的技巧,比如 par(fig=..., new=T)
,包括在另一个图中覆盖、周围或仅部分重叠)。
par(fig=c(0:1,0:1), new=TRUE)
plot.new()
newpoints <- ndc2user(c(ndcfrom$x, ndcto$x), c(ndcfrom$y, ndcto$y))
with(newpoints, arrows(x[1], y[1], x[2], y[2], col='green', lwd=2))
我本来可以避免从ndc
转换回当前用户点的ndc2user
,但那样会涉及到边距和轴扩展等问题,所以我选择不这样做。
在最后一个叠加图的用户点区域之外可能存在已转换的点,这种情况下它们可能被掩盖。要解决此问题,请在arrows
中添加xpd=NA
(或在其前面添加par(xpd=NA)
)。
![enter image description here](https://istack.dev59.com/04CGj.webp)
通用
好的,现在想象一下你想要在layout
完成后确定任何绘图的坐标。目前有一个更复杂的实现支持你所需求的功能。唯一的要求是在每个(有意义的)绘图之后调用NDC$add()
。例如:
NDC$reset()
layout(matrix(1:4, nrow=2))
plot(1)
NDC$add()
plot(11)
NDC$add()
plot(21)
NDC$add()
plot(31)
NDC$add()
with(NDC$convert(1:4, c(1,1,1,1), c(1,11,21,31)), {
arrows(x[1], y[1], x[2], y[2], xpd=NA, col='red')
arrows(x[2], y[2], x[3], y[3], xpd=NA, col='blue')
arrows(x[3], y[3], x[4], y[4], xpd=NA, col='green')
})
源代码可以在这里找到:https://gist.github.com/r2evans/8a8ba8fff060bade13bf21e89f0616c5
![enter image description here](https://istack.dev59.com/PtdOC.webp)
前面的回答
一种方法是使用par(fig=...,new=TRUE)
,但它不能保存你所需的坐标信息。
layout(matrix(1:4,nr=2))
plot(1)
plot(1)
plot(1)
plot(1)
par(fig=c(0,1,0,1),new=TRUE)
plot.new()
lines(c(0.25,0.75),c(0.25,0.75),col='blue',lwd=2)
![enter image description here](https://istack.dev59.com/HifrK.webp)
由于如果您对点的端点有更好(非任意)的控制,您可能更有可能使用此功能,因此这里有一个技巧,可以让您更好地控制这些点。如果我使用此功能,将左上角的点连接到右下角的点:
p <- locator(2)
str(p)
然后我使用以下代码替换上面的lines
:
with(p, arrows(x[1], y[1], x[2], y[2], col='green', lwd=2))
我得到了
![enter image description here](https://istack.dev59.com/lasol.webp)
(这张图片和p
中的值展示了坐标的不同。当使用par(fig=...,new=T);plot.new();
时,坐标会返回到
par('usr')
可能会有一些诡计来尝试解决这个问题(例如,如果您需要自动化此步骤),但这很可能是非常困难的(而且不够健壮)。