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

使用plot.deSolve为ccl4model每个子图添加图例的问题

解决deSolve绘图时每个子图添加图例的问题

当使用plot.deSolve同时绘制多个变量的ODE模型结果时,直接调用一次legend()只会将图例添加到最后一个子图。要让每个子图都显示对应的图例,可通过以下两种方式实现:

方法一:循环逐个绘制变量并添加图例

遍历需要绘制的变量列表,每次绘制单个变量后立即添加图例,确保每个子图都能显示图例:

library(deSolve)
head(ccl4data) # 查看观测数据

obs <- subset(ccl4data, animal == "A", c(time, ChamberConc))
names(obs) <- c("time", "CP")

parms <- c(0.182, 4.0, 4.0, 0.08, 0.04, 0.74, 0.05, 0.15, 0.32, 16.17,
            281.48, 13.3, 16.17, 5.487, 153.8, 0.04321671,
            0.40272550, 951.46, 0.02, 1.0, 3.80000000)
# 场景1
yini <- c(AI = 21, AAM = 0, AT = 0, AF = 0, AL = 0, CLT = 0, AM = 0)
out <- ccl4model(times = seq(0, 6, by = 0.05), y = yini, parms = parms)

# 场景2
par2 <- parms; par2[1] <- 0.1
out2 <- ccl4model(times = seq(0, 6, by = 0.05), y = yini, parms = par2)

# 场景3
par3 <- parms; par3[1] <- 0.05
out3 <- ccl4model(times = seq(0, 6, by = 0.05), y = yini, parms = par3)

# 定义需要绘制的变量列表
plot_vars <- c("AI","MASS", "CP")

# 设置3行1列的绘图布局
par(mfrow = c(3, 1))

# 循环绘制每个变量并添加图例
for(var in plot_vars) {
  plot.deSolve(out, out2, out3, which = var,
               col = c("black", "red", "green"), lwd = 2,
               obs = obs, obspar = list(pch = 18, col = "blue", cex = 1.2))
  legend("topright", lty = c(1,1,1,NA), pch = c(NA, NA, NA, 18),
         col = c("black", "red", "green", "blue"), lwd = 2,
         legend = c("par1", "par2", "par3", "obs"))
}

方法二:利用plot.deSolve的afterplot参数

plot.deSolve提供afterplot参数,可指定一个函数在每张子图绘制完成后自动执行,借此添加图例:

library(deSolve)
head(ccl4data) # 查看观测数据

obs <- subset(ccl4data, animal == "A", c(time, ChamberConc))
names(obs) <- c("time", "CP")

parms <- c(0.182, 4.0, 4.0, 0.08, 0.04, 0.74, 0.05, 0.15, 0.32, 16.17,
            281.48, 13.3, 16.17, 5.487, 153.8, 0.04321671,
            0.40272550, 951.46, 0.02, 1.0, 3.80000000)
# 场景1
yini <- c(AI = 21, AAM = 0, AT = 0, AF = 0, AL = 0, CLT = 0, AM = 0)
out <- ccl4model(times = seq(0, 6, by = 0.05), y = yini, parms = parms)

# 场景2
par2 <- parms; par2[1] <- 0.1
out2 <- ccl4model(times = seq(0, 6, by = 0.05), y = yini, parms = par2)

# 场景3
par3 <- parms; par3[1] <- 0.05
out3 <- ccl4model(times = seq(0, 6, by = 0.05), y = yini, parms = par3)

# 定义绘图后添加图例的函数
add_legend <- function() {
  legend("topright", lty = c(1,1,1,NA), pch = c(NA, NA, NA, 18),
         col = c("black", "red", "green", "blue"), lwd = 2,
         legend = c("par1", "par2", "par3", "obs"))
}

# 调用plot.deSolve并指定afterplot参数
plot.deSolve(out, out2, out3, which = c("AI","MASS", "CP"),
             col = c("black", "red", "green"), lwd = 2,
             obs = obs, obspar = list(pch = 18, col = "blue", cex = 1.2),
             afterplot = add_legend)

关键说明

  • 方法一通过par(mfrow)设置布局,循环中每次绘制单个变量后,当前活动窗口为刚生成的子图,此时调用legend()会直接将图例添加到该子图。
  • 方法二的afterplot参数会自动在每张子图绘制完成后执行指定函数,无需手动切换绘图窗口,代码更简洁。

内容的提问来源于stack exchange,提问作者Idowu Mariam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:23:15