使用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
相关产品推荐
相关产品推荐

