2010-07-30 9 views
6

Mam dwie dane.frame, jedną zawierającą dane surowe, a drugą zawierającą współczynniki modelowania, które wyprowadziłem z nieprzetworzonych danych.Nakładanie wielu wywołań funkcji stat_function w ggplot2

Więcej szczegółów: Pierwsza data.frame "raw" zawiera "Czas" (od 0s do 900s) i "OD" dla wielu Wariantów i czterech przebiegów. Drugi element data.frame "coef" zawiera jeden wiersz na kombinację Wariant/Uruchom, z poszczególnymi współczynnikami ("M", "D.1" i "t0.1") w tym wierszu.

Wykreśliłem podział danych nieprzetworzonych w wariancie i pokolorowałem według identyfikatora runID, bez problemu. Ale teraz chcę nałożyć krzywe modelu zgodnie z identyfikatorem runID.

Ponieważ współczynniki modelowania znajdują się w innym folderze data.frame (o różnych rozmiarach, więc nie mogę ich powiązać), funkcja stat_function nie będzie działać dla mnie. Mogę na bieżąco wyświetlać krzywą.

Próbowałem z dla() {} pętli dodanie warstwy stat_function każdorazowo:

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) 

Na koniec, wszystkie „P” zwraca się wykres danych źródłowych i końcowy łuk z pętli. "p" wydaje się powracać do swojego pierwotnego stanu za każdym razem, gdy próbuję dodać nową warstwę "stat_function".

Wszelkie pomysły?

+0

Być może najłatwiejszą metodą byłoby scalenie danych.frames. Czy to możliwe? – DrewConway

+0

Czy możesz podać odtwarzalny przykład? Problem polega na tym, że używasz zmiennej zakresu. – hadley

Odpowiedz

1

Podążając za rozwiązaniem podanym w [1], konieczne może być samodzielne naśladowanie efektu działania stat_function. Ponieważ nie dają powtarzalne przykład, stworzyłem prosty jeden, który mam nadzieję, że naśladuje swój 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] using stat_function and facet_wrap together in GGPLOT2 in R

0

miałem ten sam problem z wami. W bardzo non-eleganckie rozwiązanie, jedynym rozwiązaniem znalazłem hack funkcji stat razem coś takiego:

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 

co jest w porządku, jeśli masz tylko kilka linijek dodać, ale jeśli nie masz wiele .