2010-07-30 30 views
6

में ओवरले एकाधिक stat_function कॉल मेरे पास दो डेटा हैं। फ्रेम, जिनमें कच्चा डेटा होता है और अन्य जिसमें मॉडलिंग गुणांक होते हैं जिन्हें मैंने कच्चे डेटा से प्राप्त किया है।ggplot2

अधिक जानकारी: पहला डेटा। फ्रेम "कच्चे" में कई प्रकार और चार रनों के लिए "टाइम" (900 से 9 0) और "ओडी" शामिल है। दूसरा डेटा। फ्रेम "कोफ" में उस पंक्ति में व्यक्तिगत गुणांक ("एम", "डी .1" और "टी 0.1") के साथ एक पंक्ति प्रति संस्करण/रन संयोजन होता है।

मैंने प्रति संस्करण कच्चे डेटा विभाजन और runID द्वारा रंगीन, कोई समस्या नहीं बनाई है। लेकिन अब मैं runID के अनुसार मॉडल वक्र ओवरले करना चाहता हूँ।

चूंकि मॉडलिंग गुणांक एक अलग डेटा में हैं। फ्रेम (विभिन्न आयामों के साथ, इसलिए मैं उन्हें केवल cbind नहीं कर सकता), stat_function मेरे लिए काम नहीं करेगा। मैं एक समय में वक्र दिखा सकता हूं।

मैं के लिए एक() {} पाश के साथ की कोशिश की है, एक stat_function परत हर बार जोड़ने: अंत में

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) 

, सभी "पी" रिटर्न कच्चे डेटा की साजिश और अंतिम अवस्था है लूपिंग बिट से। हर बार जब मैं एक नई "stat_function" परत जोड़ने की कोशिश करता हूं तो "पी" अपने मूल स्थिति में वापस आ जाता है।

कोई विचार?

+0

शायद सबसे आसान फिक्स डेटा.फ्रेम को मर्ज करना होगा। क्या यह व्यवहार्य है? – DrewConway

+0

क्या आप एक पुनरुत्पादित उदाहरण प्रदान कर सकते हैं? समस्या वेरिएबल स्कोपिंग का उपयोग है। – hadley

उत्तर

1

[1] में दिए गए समाधान के बाद, आपको stat_function के प्रभाव का अनुकरण करना पड़ सकता है।

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

मैं तुम्हारे साथ एक ही समस्या थी: चूंकि आप एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण देना नहीं है, मैं एक साधारण एक है कि उम्मीद है कि आपकी समस्या की नकल करता बनाया। एक बहुत ही गैर सुरुचिपूर्ण समाधान में, एकमात्र समाधान मैंने पाया स्टेट कार्यों को एक साथ कुछ इस तरह हैक करने गया था:

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 

कौन सा ठीक है अगर आप केवल जोड़ने के लिए कुछ लाइनें है, लेकिन आप कई अगर नहीं ।