使用par(xpd=T)在R绘图区域外绘制图像失效问题排查
这不是bug,问题出在你对image()函数参数的用法上,另外还有一些细节需要注意,咱们一步步理清楚:
首先,image()对输入的x和y参数有明确要求:x的长度必须等于ncol(z)+1,y的长度必须等于nrow(z)+1——因为image()是绘制网格热图,x和y定义的是网格的边界坐标。看你的代码,m是一个2行10列的矩阵(nrow=2,ncol=10),但你给的x是长度为2的向量,y是长度为10的向量,这完全不匹配,R会自动循环这些值来填充,但结果肯定不是你想要的,这也是导致图像被异常裁剪的核心原因。
接下来,咱们修正参数,再结合par(xpd)来实现你想要的“在绘图区域外绘制图例”的需求:
# 设置边距,给右侧留出足够空间 par(mar=c(4,4,4,6), xpd=F) # 绘制基础图,手动设置xlim,确保后续image的x范围能覆盖到margin区域 plot(1:2, 1:2, xlim=c(0.8, 2.6)) # 定义符合image要求的x、y和矩阵m # m是2行10列,所以x需要11个值(ncol+1),y需要3个值(nrow+1) x <- seq(2.1, 2.3, len=11) # 右侧margin区域的x边界 y <- seq(1.1, 1.9, len=3) # y边界 m <- matrix(seq(0,1,len=20), nrow=2, ncol=10, byrow=T) # 2行10列,对应y的3个边界、x的11个边界 # 允许绘制到图形区域(包括四周的margin) par(xpd=T) image(x, y, m, add=T) # 测试xpd=NA,允许绘制到整个设备区域(超出margin的位置) par(xpd=NA) x2 <- seq(2.4, 2.6, len=11) image(x2, y, m, add=T)
再解释几个关键细节:
- 修正
x和y的长度后,image()能正确识别要绘制的区域范围,不会因为参数不匹配出现异常; - 手动设置
plot()的xlim,确保后续image()的x坐标落在图形设备的坐标系内(否则即使xpd=T,超出设备坐标系的部分还是会被裁剪); par(xpd=T)确实会允许绘制到图形区域(包括四周的margin),xpd=NA则允许绘制到整个设备区域(比如超出margin的位置)。
回到你的原始代码,因为x和y的长度与m不匹配,R无法正确解析你要绘制的区域,才导致了看起来xpd不生效的假象。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

