2010-07-30 6 views
6

Ich habe zwei data.frames, eine mit Rohdaten und die andere mit Modellierungskoeffizienten, die ich aus den Rohdaten abgeleitet habe.Overlay mehrere stat_function Aufrufe in ggplot2

Mehr Details: Der erste data.frame "roh" enthält "Zeit" (0s bis 900s) und "OD" für viele Varianten und vier Läufe. Der zweite Datenrahmen "coef" enthält eine Zeile pro Variant/Lauf-Kombination mit den einzelnen Koeffizienten ("M", "D.1" und "t0.1") in dieser Reihe.

Ich habe die Rohdatenaufteilung pro Variante geplottet und farbig nach runID, kein Problem. Aber jetzt möchte ich die Modellkurven nach der runID überlagern.

Da die Modellierungskoeffizienten in einem anderen data.frame sind (mit verschiedenen Dimensionen, also kann ich sie nicht einfach binden), funktioniert stat_function nicht für mich. Ich kann auf eine Kurve zeigen, die zu einer Zeit zeigt.

Ich habe mit einem versuchten() {} Schleife einer stat_function Schicht jedes Mal Zugabe:

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) 

Am Ende all „p“ zurückgibt, ist der Plot der Rohdaten und die letzte Kurve aus dem Schleifenbit. "p" scheint jedes Mal, wenn ich versuche, eine neue "stat_function" -Schicht hinzuzufügen, in den ursprünglichen Zustand zurückzukehren.

Irgendwelche Ideen?

+0

Vielleicht die einfachste Lösung wäre, die data.frames zusammenzuführen. Ist das machbar? – DrewConway

+0

Können Sie ein reproduzierbares Beispiel liefern? Das Problem liegt in der Verwendung des Variablen-Scopings. – hadley

Antwort

1

Nach der Lösung in [1] müssen Sie möglicherweise den Effekt von stat_function selbst nachahmen. Da Sie nicht ein reproduzierbares Beispiel geben, habe ich eine einfache, die hoffentlich Ihr Problem nachahmt:

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

ich mit Ihnen das gleiche Problem hatte. In einer sehr nicht-elegante Lösung, die einzige Lösung, ich fand, war die Stat-Funktionen zusammen, so etwas zu hacken:

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 

was in Ordnung ist, wenn Sie nur ein paar Zeilen hinzuzufügen haben, aber nicht, wenn Sie viele haben .