我有两个数据框raw
和coef
:
第一个数据框raw
包含:
Time
(0到900秒)OD
为许多变种和四个运行。第二个数据框coef
包含:
M
,D.1
和t0.1
)。我已经绘制了每个变体的原始数据分割并由runID
着色,没有问题。但是,现在我想根据runID
覆盖模型曲线。
由于建模系数是在不同的数据框架中,具有不同的维度,我不能只是cbind
他们。 stat_function
不适合我。我一次只能显示一条曲线。
我尝试过使用for loop
,每次添加一个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)
最后,所有p
返回的是原始数据的图,以及循环位的最终曲线。每当我尝试添加一个新的p
图层时,stat_function
似乎恢复到原始状态。
有任何想法吗 ?
继given here解决方案之后,您可能必须自己模仿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
我和你有同样的问题。在一个非常不优雅的解决方案中,我发现的唯一解决方案是将stat函数组合在一起,如下所示:
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)))}
p <- p +
stat_function(fun = function(x){temp.n$M[1] * (1 - exp(temp.n$D.1[1] * temp.n$t0.1[1] - x)))) +
stat_function(fun = function(x){temp.n$M[2] * (1 - exp(temp.n$D.1[2] * temp.n$t0.1[2] - x)))) +
stat_function(fun = function(x){temp.n$M[3] * (1 - exp(temp.n$D.1[3] * temp.n$t0.1[3] - x)))) +
# etc
如果您只需要添加几行,那么这很好,但如果您有很多行则不行。