如何在R中为不同初始C_WT值绘制时间-C_WT曲线至同一图表
问题
如何在R语言中,将vectorC_WT内不同初始C_WT值对应的时间(X轴)与C_WT(Y轴)的折线图绘制在同一个图表中?
原代码如下:
kon_WT = 1 koff_WT = 10 R_WT = 20 Complex <- function (t,y,parms){ with(as.list(y), { dC_WT <- koff_WT*RL_WT -kon_WT*R_WT*C_WT dRL_WT <- kon_WT*R_WT*C_WT - koff_WT*RL_WT #uM dR_WT <- koff_WT*RL_WT -kon_WT*R_WT*C_WT return(list(c(dC_WT, dRL_WT, dR_WT))) }) } resC_WT <- function(iC_WT) { times <- seq(0,1,0.01) Out <- ode(y = c(C_WT = iC_WT, RL_WT = 0, R_WT= R_WT), times = times, func=Complex, parms=NULL) Output <- data.frame(Out) } vectorC_WT <- 1:11 sapply(vectorC_WT, FUN=resC_WT) Complex1 <- as.data.frame(t(Complex1))
解决方案
首先需要把sapply返回的多个数据框合并成一个带分组标识的完整数据框,再进行绘图。
步骤1:修正数据处理逻辑
原代码中sapply返回的是列表,我们给每个子数据框添加一列标记初始C_WT值,再合并成单个数据框:
# 加载ode函数所属的deSolve包 library(deSolve) # 保留原有参数与函数定义 kon_WT = 1 koff_WT = 10 R_WT = 20 Complex <- function (t,y,parms){ with(as.list(y), { dC_WT <- koff_WT*RL_WT - kon_WT*R_WT*C_WT dRL_WT <- kon_WT*R_WT*C_WT - koff_WT*RL_WT dR_WT <- koff_WT*RL_WT - kon_WT*R_WT*C_WT return(list(c(dC_WT, dRL_WT, dR_WT))) }) } resC_WT <- function(iC_WT) { times <- seq(0,1,0.01) Out <- ode(y = c(C_WT = iC_WT, RL_WT = 0, R_WT= R_WT), times = times, func=Complex, parms=NULL) Output <- data.frame(Out) # 添加初始C_WT标识列,用于后续分组绘图 Output$initial_C_WT <- iC_WT return(Output) } vectorC_WT <- 1:11 # 用lapply生成带标识的子数据框列表,再合并为完整数据框 all_data <- do.call(rbind, lapply(vectorC_WT, resC_WT))
步骤2:绘制折线图
方法1:使用基础绘图系统
# 初始化空白画布 plot(0, 0, type = "n", xlim = range(all_data$time), ylim = range(all_data$C_WT), xlab = "时间", ylab = "C_WT", main = "不同初始C_WT值的时间变化曲线") # 循环为每个初始值绘制折线 for (init_val in unique(all_data$initial_C_WT)) { subset_data <- subset(all_data, initial_C_WT == init_val) lines(subset_data$time, subset_data$C_WT, col = init_val, lwd = 2) } # 添加图例区分不同初始值 legend("topright", legend = unique(all_data$initial_C_WT), col = unique(all_data$initial_C_WT), lwd = 2, title = "初始C_WT值")
方法2:使用ggplot2(更简洁美观)
# 先安装并加载ggplot2包(首次使用需执行install.packages("ggplot2")) library(ggplot2) ggplot(all_data, aes(x = time, y = C_WT, color = factor(initial_C_WT))) + geom_line(linewidth = 1) + labs(x = "时间", y = "C_WT", title = "不同初始C_WT值的时间变化曲线", color = "初始C_WT值") + theme_minimal()
关键说明
- 必须提前加载
deSolve包,否则ode函数无法运行;使用ggplot2绘图时也需提前安装加载。 - 添加
initial_C_WT列是核心:它能让我们区分不同初始值对应的曲线,是同图绘制多折线的前提。
内容的提问来源于stack exchange,提问作者Khushhi
相关产品推荐
相关产品推荐

