You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改R代码实现2×2图像子图共用底部色条?

解决2行2列子图加底部共用色条的问题

需求:绘制4个z ~ x+y的子图,按2行2列排列,底部配共用色条,现有代码无法实现,需要修改哪些部分?

原代码的核心问题

  1. 同时混用par(mfrow)和layout,导致布局逻辑冲突,子图和色条位置混乱
  2. 每个子图重复绘制侧边色条,不符合“共用色条”的需求
  3. 色条位置设置为侧边,而非要求的底部

具体修改点

  • 重新规划整体布局:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 12:10:38