R语言散点图中grid::polygonGrob(native单位)无法绘制问题
在R语言散点图中添加grid多边形(polygonGrob)的解决方法
你遇到的问题核心是base绘图系统(graphics::plot、graphics::polygon)和grid绘图系统(grid::polygonGrob)是两套独立的体系,直接调用grid.draw无法让grid元素正确显示在base绘制的图上,因为两者的坐标系统不兼容。
解决步骤
要让grid的多边形显示在base散点图上,需要借助gridBase包来衔接两个系统的坐标:
- 安装并加载
gridBase包(未安装的话先执行install.packages("gridBase")) - 在base绘图完成后,获取当前绘图区域的grid视口(viewport)
- 切换到该视口,将base原生坐标转换为grid兼容的坐标后,再绘制polygonGrob
修正后的代码
# 加载所需包 library(grid) library(gridBase) rand <- rnorm(3000, 1, 2) plot(rand) xy <- list(x = c(569.781985656951, 575.109507204421, 1917.64493716692, 1917.64493716692), y = c(2.28350942471649, -1.44814265497201, -1.44814265497201, 2.99591573083884)) # 先用graphics::polygon绘制红色多边形(对比用) polygon(xy$x, xy$y, border = "red") # 切换到base绘图对应的grid视口 pushViewport(viewport()) # 转换坐标:将base原生坐标转为grid的标准化坐标(npc,范围0-1) grid_x <- convertX(unit(xy$x, "native"), "npc", valueOnly = TRUE) grid_y <- convertY(unit(xy$y, "native"), "npc", valueOnly = TRUE) # 绘制蓝色grid多边形 grid.draw(polygonGrob(x = grid_x, y = grid_y, gp = gpar(col = "blue", fill = "transparent"))) popViewport()
关键说明
- 直接用
default.units = "native"时,grid的"native"单位指向自身的坐标系统,和base绘图区域不匹配,所以图形无法显示;必须通过convertX/convertY完成坐标映射。 gridBase的作用是建立base和grid系统的坐标关联,让grid能识别base的绘图空间。
内容的提问来源于stack exchange,提问作者Crops
相关产品推荐
相关产品推荐

