views:

44

answers:

1

I have two data.frames, one containing raw data and the other containing modelling coefficients that I have derived from the raw data.

More detail: The first data.frame "raw" contains "Time" (0s to 900s) and "OD" for many Variants and four runs. The second data.frame "coef" contains one row per Variant/run combination, with the individual coefficients ("M", "D.1" and "t0.1") in that row.

I have plotted the raw data split per Variant and coloured by runID, no problem. But now I want to overlay the model curves according to the runID.

Since the modelling coeffients are in a different data.frame (with different dimensions, so I can't just cbind them), stat_function won't work for me. I can get on curve showing at a time.

I have tried with a for(){} loop, adding a stat_function layer each time:

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)

At the end, all "p" returns is the plot of the raw data and the final curve from the looping bit. "p" seems to revert to its original state every time I try to add a new "stat_function" layer.

Any ideas?

A: 

Following on the solution given in [1], you might have to imitate the effect of stat_function yourself. Since you do not give a reproducible example, I created a simple one that hopefully mimics your problem:

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 

[1] http://stackoverflow.com/questions/1376967/using-stat-function-and-facet-wrap-together-in-ggplot2-in-r

Aniko