原来你可以grid.path(...)
在grid
包中做到这一点。阅读文档以了解如何创建带有孔的路径。
library(gridExtra)
library(ggplot2)
ggp <- ggplot(mtcars, aes(mpg, wt)) + geom_point(size=3)
grid.newpage()
grid.draw(arrangeGrob(ggp))
grid.path(c(0,0,1,1,.48,.48,.62,.62),
c(0,1,1,0,.43,.50,.50,.43),
id=rep(1:2, each=4),
rule="evenodd",gp=gpar(fill="black", alpha=0.6))

注意:grid.draw(...)
并且grid.path(...)
在grid
包装中;arrangeGrob(...)
在gridExtra
包装中。加载gridExtra
导致grid
加载。感谢@MartinBel 建议编辑。
回应@BrandonBertelsen 评论:grid.path(...)
对形状不可知论;你只需要提供坐标。
center <- c(x=0.55,y=0.48)
r <- 0.1
circle <- do.call(rbind,lapply(seq(0,2*pi,length=36),
function(th)c(x=r*cos(th),y=r*sin(th))))
circle <- data.frame(circle)
circle$x <- circle$x + center["x"]
circle$y <- circle$y + center["y"]
ggp <- ggplot(mtcars, aes(mpg, wt)) + geom_point(size=3)
grid.newpage()
grid.draw(arrangeGrob(ggp))
grid.path(c(0,0,1,1,circle[,1]),
c(0,1,1,0,circle[,2]),
id=c(1,1,1,1,rep(2,nrow(circle))),
rule="evenodd",gp=gpar(fill="black", alpha=0.6))

由于绘图窗口的纵横比,“圆”是一个椭圆。
进一步阅读:这不是你画的,而是你不画的,作者 Paul Murrell 在 R 杂志上