10

I have two data frames raw and coef:

  • one containing raw data
  • the other containing modelling coefficients that I have derived from the raw data.

The first data frame raw contains :

  • Time (0 to 900 seconds)
  • 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 colored by runID, without a problem. But, now I want to overlay the model curves according to the runID.

Since the modelling coefficients are in a different data frames, with different dimensions, I can't just cbind them. stat_function won't work for me. I can get only one 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 ?

2
  • Perhaps the easiest fix would be to merge the data.frames. Is that feasible? Commented Aug 2, 2010 at 14:11
  • Can you provide a reproducible example? The problem is your use of variable scoping. Commented Aug 6, 2010 at 23:55

2 Answers 2

4

Following on the solution given here, 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 
Sign up to request clarification or add additional context in comments.

Comments

1

I had the same problem with you. In a very non-elegant solution, the only solution I found was to hack the stat functions together something like this:

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

Which is fine if you only have a few lines to add, but not if you have many.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.