2010-07-30 14 views
6

Tengo dos data.frames, uno que contiene datos sin procesar y el otro que contiene coeficientes de modelado que he derivado de los datos sin formato.Superposición de varias llamadas a stat_function en ggplot2

Más detalles: El primer data.frame "raw" contiene "Time" (0s a 900s) y "OD" para muchas variantes y cuatro ejecuciones. El segundo "coef" data.frame contiene una fila por combinación de Variant/run, con los coeficientes individuales ("M", "D.1" y "t0.1") en esa fila.

He trazado la división de datos brutos por Variante y coloreado por runID, no hay problema. Pero ahora quiero superponer las curvas del modelo de acuerdo con el runID.

Dado que los coeficientes de modelado están en un data.frame diferente (con diferentes dimensiones, así que no puedo simplemente conectarlos), stat_function no funcionará para mí. Puedo mostrarme la curva a la vez.

He tratado con a para() {} de bucle, la adición de una capa stat_function cada vez:

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) 

Al final, todos los "p" devuelve es la trama de los datos en bruto y la curva final desde el bit de bucle. "p" parece volver a su estado original cada vez que intento agregar una nueva capa "stat_function".

¿Alguna idea?

+0

Quizás la solución más fácil sería fusionar los data.frames. ¿Es eso factible? – DrewConway

+0

¿Puede proporcionar un ejemplo reproducible? El problema es su uso del alcance variable. – hadley

Respuesta

1

Siguiendo con la solución dada en [1], es posible que tenga que imitar el efecto de stat_function usted mismo. Puesto que usted no da un ejemplo reproducible, he creado un sencillo que es de esperar imita su problema:

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] using stat_function and facet_wrap together in GGPLOT2 in R

0

he tenido el mismo problema con usted. En una solución muy no-elegante, la única solución que encontré fue a piratear las funciones estadísticas en conjunto algo como esto:

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 

Lo cual está bien si sólo tiene unas pocas líneas para añadir, pero no si tiene muchos .

Cuestiones relacionadas