如何修改R代码实现2×2图像子图共用底部色条?
解决2行2列子图加底部共用色条的问题
需求:绘制4个
z ~ x+y的子图,按2行2列排列,底部配共用色条,现有代码无法实现,需要修改哪些部分?
原代码的核心问题
- 同时混用
par(mfrow)和layout,导致布局逻辑冲突,子图和色条位置混乱 - 每个子图重复绘制侧边色条,不符合“共用色条”的需求
- 色条位置设置为侧边,而非要求的底部
具体修改点
- 重新规划整体布局:用
layout创建包含4个子图+1个底部色条的布局结构,替代原有的mfrow和重复色条代码 - 统一坐标轴标签:仅给左列子图添加y轴标签,底部子图添加x轴标签,避免冗余重复
- 绘制底部共用色条:在布局的底部区域用
imageScale绘制横向色条,并添加统一的色标标题 - 移除冗余代码:删掉每个子图内的
imageScale和色标文本,只保留一次全局共用设置
修改后的完整代码
library(akima) library(sinkr) #----生成随机xyz数据---- x = seq(0.1,0.8,0.02) y = seq(0.1,5,0.1) z1 <- runif(length(x)*length(y),0,600) # 样本1 z1 <- matrix(unlist(z1), nrow = length(x), ncol = length(y)) z2 <- runif(length(x)*length(y),0,600) # 样本2 z2 <- matrix(unlist(z2), nrow = length(x), ncol = length(y)) z3 <- runif(length(x)*length(y),0,600) # 样本3 z3 <- matrix(unlist(z3), nrow = length(x), ncol = length(y)) z4 <- runif(length(x)*length(y),0,600) # 样本4 z4 <- matrix(unlist(z4), nrow = length(x), ncol = length(y)) #----绘制图像并保存---- png( filename="~/plot.PNG", width=12, height=8, units="in", res=600) par(family = "serif") # 布局规划:2行子图 + 1行底部色条,色条高度占比更小 layout(matrix(c(1,2,3,4,5,5), nrow=3, ncol=2, byrow=TRUE), heights = c(4,4,1), # 前两行是子图,第三行是色条 widths = c(1,1)) # 全局绘图设置 ncolors <- 64 colors <- jetPal(ncolors) zlim <- c(0,600) breaks <- c(seq(zlim[1], zlim[2], length.out = ncolors), 1e6) #---子图1---- image(x, y, z1, col = colors, breaks = breaks, zlim = zlim, cex.lab=1.5,cex.axis=1.5,xlab="",ylab="", ylim=c(0.1,5.0),xlim=c(0.1,0.8)) title(ylab=expression(y),line=2.0,cex.lab=1.5, family='serif') title(main="(a)",adj=0, cex.main=1.5) #---子图2---- image(x, y, z2, col = colors, breaks = breaks, zlim =zlim, cex.lab=1.5,cex.axis=1.5,xlab="",ylab="", ylim=c(0.1,5.0),xlim=c(0.1,0.8)) title(main="(b)",adj=0, cex.main=1.5) #---子图3---- image(x, y, z3, col = colors, breaks = breaks, zlim =zlim, cex.lab=1.5,cex.axis=1.5,xlab="",ylab="", ylim=c(0.1,5.0),xlim=c(0.1,0.8)) title(ylab=expression(y),line=2.0,cex.lab=1.5, family='serif') title(xlab=expression(x),line=2.5,cex.lab=1.5, family='serif') title(main="(c)",adj=0, cex.main=1.5) #---子图4---- image(x, y, z4, col = colors, breaks = breaks, zlim = zlim, cex.lab=1.5,cex.axis=1.5,xlab="",ylab="", ylim=c(0.1,5.0),xlim=c(0.1,0.8)) title(xlab=expression(x),line=2.5,cex.lab=1.5, family='serif') title(main="(d)",adj=0, cex.main=1.5) #---底部共用色条---- par(mar=c(3,0,0,0)) # 调整色条区域的边距 imageScale(z = z1, zlim = zlim, col = colors, breaks = breaks, axis.pos = 1, # 设置为横向色条,坐标轴在底部 add=FALSE) mtext(expression(g[sc]~(mmol~m^-2~s^-1)), side=1, line=2, cex=1.5, family='serif') dev.off()
内容的提问来源于stack exchange,提问作者raghav
相关产品推荐
相关产品推荐

