R语言:如何在2×2多面板图中保留每个子图的轴边框
解决多面板图中顶部子图边框消失的问题
问题:制作2行2列的4面板图时,单独绘制顶部两个子图时边框正常,但添加底部两个子图后,顶部子图的边框消失。尝试过box(lty = "solid", col = 'black')、plot()里的fg='black'和bty="o"都无效。
问题原因
你在绘制右上角子图时多次设置了par(xpd = NA),这个参数会全局生效,后续所有绘图的元素都会被允许绘制到设备区域之外,导致顶部子图的边框被绘制在了可视区域外,看起来像是消失了。
修复方案
不要全局修改xpd参数,而是在需要绘制区域外文本时,临时在text()函数中指定xpd=NA,避免全局影响后续绘图。
以下是修正后的完整代码:
library(biwavelet) # 初始化绘图参数,仅设置一次全局xpd=FALSE par(mfrow = c(2,2), xpd=FALSE) par(mar = c(1,1,1.1,1.1) + 0.1, oma = c(3,3,0.5,0.5) + 0.1) dat <- as.data.frame(matrix(nrow = 500, ncol = 2)) dat[1] <- seq(1,500) # 左上角子图 dat[2] <- sin(dat[1]) plot(wt(dat), xaxt = 'n', xlab = "", cex.axis = 1.5, cex.lab = 1.5) axis(1, at = seq(0, 500, by = 100), cex.axis = 1.5, col.axis = 'NA') mtext("Variable 1", side = 3, cex = 1.5, line = 0.1) box(lty = "solid", col = 'black') # 右上角子图 dat[2] <- sin(dat[1]*.5) plot(wt(dat), xaxt = 'n', col.axis = 'NA', xlab = "", ylab = "") axis(1, at = seq(100, 500, by = 100), cex.axis = 0.1, col.axis = 'NA') mtext("Variable 2", side = 3, cex = 1.5, line = 0.1) # 在text函数中临时设置xpd=NA,不全局修改参数 text("Location 1", x = 520, y = 4.1, srt = 270, cex = 1.5, xpd = NA) box(lty = "solid", col = 'black') # 左下角子图 dat[2] <- sin(dat[1]*.25) plot(wt(dat), cex.axis = 1.5, xlab = "", ylab = "") axis(1, at = seq(100, 500, by = 100), cex.axis = 1.5) box(lty = "solid", col = 'black') # 右下角子图 dat[2] <- sin(dat[1]*.125) plot(wt(dat), col.axis = 'NA', ylab = "", xlab = "") axis(1, at = seq(100, 500, by = 100), cex.axis = 1.5) # 同样在text里临时设置xpd=NA text("Location 2", x = 520, y = 4.5, srt = 270, cex = 1.5, xpd = NA) box(lty = "solid", col = 'black') title(xlab = "Time (hours)", ylab = "Period", outer = TRUE, line = 1.5, cex.lab = 1.5)
关键修改点
- 移除所有全局的
par(xpd = NA)调用,改为在text()函数内通过xpd=NA参数临时允许绘制区域外文本 - 保持初始的
par(xpd=FALSE),确保后续所有绘图元素(包括边框)都在可视区域内正常绘制
内容的提问来源于stack exchange,提问作者tassones
相关产品推荐
相关产品推荐

