在ggplot2中叠加多个stat_function调用

Ben*_*inH 9 plot overlay r function ggplot2

我有两个data.frames,一个包含原始数据,另一个包含我从原始数据派生的建模系数.

更多细节:第一个data.frame"raw"包含"Time"(0s到900s)和"OD",用于许多Variants和4次运行.第二个data.frame"coef"每个Variant/run组合包含一行,该行中有各个系数("M","D.1"和"t0.1").

我已经绘制了每个Variant的原始数据分割并用runID着色,没问题.但现在我想根据runID覆盖模型曲线.

由于建模系数是在不同的data.frame(具有不同的维度,所以我不能只是cbind),stat_function对我不起作用.我可以一次显示曲线.

我尝试过for(){}循环,每次都添加一个stat_function图层:

p <- ggplot(temp, aes(Time, OD)) + geom_point(aes(colour = runID), size = 2) #works fine!
calc <- function(x){temp.n$M[ID] * (1 - exp(temp.n$D.1[ID] * temp.n$t0.1[ID] - x)))}
for(ID in 1:length(unique(temp.n$runID))) {
  p <- p + stat_function(fun = calc)
}
print(p)
Run Code Online (Sandbox Code Playgroud)

最后,所有"p"返回是原始数据和循环位的最终曲线的图.每当我尝试添加新的"stat_function"图层时,"p"似乎恢复到原始状态.

有任何想法吗?

Ani*_*iko 4

按照这里给出的解决方案,您可能必须模仿自己的效果stat_function。由于您没有给出可重现的示例,因此我创建了一个简单的示例,希望能够模拟您的问题:

library(ggplot2)
reg.fun <- function(x, par1, par2){exp(-x*par1) + par2} #functional form
reg <- data.frame(g=factor(1:3), par1=(1:3)/10, par2=1:3)  #parameters for 3 groups

#generate data from reg.fun
dd <- expand.grid(x=0:9, g=reg$g)         #set x values, and 3 groups from reg
dd <- merge(dd, reg)                      #"import" parameters
dd$mn <- with(dd, reg.fun(x, par1, par2)) #value of function for given x's
dd$y <- rnorm(30, mean=dd$mn, sd=0.5)     #add variability
dd <- subset(dd, select=c(g,x,y))         #remove auxiliary variables 

#similarly to above generate values for the function on a fine grid of x values
pred.dd <- expand.grid(x=seq(0,9, length=101), g=levels(dd$g))
pred.dd <- merge(pred.dd, reg)
pred.dd$y <- with(pred.dd, reg.fun(x, par1, par2))

#draw the plot
p <- qplot(x,y, colour=g, data=dd)  #scatterplot of data
p + geom_line(data=pred.dd)         #add the curves of the functions 
Run Code Online (Sandbox Code Playgroud)