R语言提取子图区域坐标 实现grid.picture()精准叠加PS图像
问题1:提取第一个子图的坐标范围
基础绘图系统中,刚绘制完第一个子图后立刻执行par("usr"),就能拿到当前子图的用户坐标范围,返回值格式为c(x轴最小值, x轴最大值, y轴最小值, y轴最大值)。
但因为grImport基于grid绘图体系,和基础绘图的坐标体系不互通,更简单的方法是用gridBase包直接获取当前子图对应的grid视口(viewport)参数,避免手动转换坐标出错。
问题2:精准叠加PS图像的实现方法
你需要按照「画第一个子图→激活对应grid视口→叠加PS图像→绘制剩余子图」的顺序执行代码,完整可运行示例如下:
# 加载所需包 library(grImport) library(gridBase) # 你的样本PS对象 pic <- new("Picture", paths = list(path = new("PictureFill", rule = "nonzero", x = c(move = 0, line = 1315.47, line = 1315.47, line = 0, line = 0), y = c(move = 1080, line = 1080, line = 7.37891, line = 7.37891, line = 1080), rgb = "#D0D1E6", lty = numeric(0), lwd = 10, lineend = 1, linejoin = 1, linemitre = 10)), summary = new("PictureSummary", numPaths = 1, xscale = c(xmin = 0, xmax = 1315.47), yscale = c(ymin = 7.37891, ymax = 1080))) # 设置2行2列布局 par(mfrow = c(2, 2), mar = c(2, 2, 2, 2)) # 先画左上角第一个子图 plot(1, col = "red", pch = 15) # 获取当前子图对应的grid视口,推入视口栈 vps <- baseViewports() pushViewport(vps$plot) # 绘制PS图像,参数设置为铺满当前视口 grid.picture(pic, x = 0.5, y = 0.5, width = 1, height = 1, just = c("center", "center")) # 退出当前视口,避免影响后续绘图 popViewport() # 绘制剩余三个子图 plot(1, col = "blue", pch = 15) plot(1, col = "orange", pch = 15) plot(1, col = "purple", pch = 15)
这种方法不需要手动做坐标换算,baseViewports()已经自动匹配了当前基础绘图子图的绘图区域范围,PS图像会刚好铺满第一个子图的绘图区域,不会超出也不会偏移。需要注意一定要在绘制完第一个子图后立刻执行叠加操作,基础绘图的当前子图指针按绘制顺序移动,先画完所有子图再处理的话,获取到的就是最后一个子图的坐标了。
内容的提问来源于stack exchange,提问作者Gimelist
相关产品推荐
相关产品推荐

