दिलचस्प पोस्ट
चयनित कॉलमों के लिए तालिका में एनए वैल्यू कैसे बदल सकता है? data.frame, data.table 'एपली () के साथ' नया 'ऑपरेटर का प्रयोग करें। क्या यह संभव है? गिटब के साथ धक्का लगाते समय त्रुटि: घातक: उपयोगकर्ता नाम को नहीं पढ़ा जा सका क्या मैं WKWebView द्वारा उपयोग की जाने वाली कुकी सेट कर सकता हूं? बड़ी सरणी घोषित करते समय स्टैक अतिप्रवाह अपवाद प्राप्त करना कॉल removeView () पहले बच्चे के माता-पिता पर ColdFusion 10 में CF_SQL_NVARCHAR का उपयोग करने के लिए क्या विवरण हैं? बंद करने के लिए माता-पिता को डेटा वापस करने के लिए पॉपअप विंडो संपत्ति से एंड्रॉइड वेबविव जावास्क्रिप्ट targetSdkVersion सेटिंग सूची <टी> गारंटी प्रविष्टि आदेश करता है? <Head> या just before </ body> जावास्क्रिप्ट? अजगर: कई संदर्भ प्रबंधकों पर "के साथ" ब्लॉक बनाएं NSCharacterset से NSArray कॉलम में एकाधिक मानों के साथ प्रश्न

stat_function और facet_wrap का उपयोग करके जीजीपीएल 22 में आर में

मैं GGPLOT2 के साथ जाली के प्रकार के डेटा को साजिश करने की कोशिश कर रहा हूं और फिर नमूने डेटा पर एक सामान्य वितरण को बेहतर बनाने के लिए स्पष्ट करता हूं कि अंतर्निहित डेटा कितनी दूर है। मैं समान माध्य और पैनल के रूप में stdev को प्राप्त करने के लिए शीर्ष पर सामान्य वितरण करना चाहता हूं।

यहाँ एक उदाहरण है:

library(ggplot2) #make some example data dd<-data.frame(matrix(rnorm(144, mean=2, sd=2),72,2),c(rep("A",24),rep("B",24),rep("C",24))) colnames(dd) <- c("x_value", "Predicted_value", "State_CD") #This works pg <- ggplot(dd) + geom_density(aes(x=Predicted_value)) + facet_wrap(~State_CD) print(pg) 

ये सभी महान काम करता है और डेटा के एक अच्छा तीन पैनल ग्राफ का उत्पादन करता है। मैं शीर्ष पर सामान्य जिंदगी कैसे जोड़ूं? ऐसा लगता है कि मैं stat_function का उपयोग करेगा, लेकिन यह विफल रहता है:

 #this fails pg <- ggplot(dd) + geom_density(aes(x=Predicted_value)) + stat_function(fun=dnorm) + facet_wrap(~State_CD) print(pg) 

ऐसा प्रतीत होता है कि stat_function facet_wrap सुविधा के साथ नहीं मिल रहा है मैं इन दो को अच्छी तरह से कैसे खेलूं?

———— संपादित ———

मैंने नीचे दिए गए दो उत्तरों से विचारों को एकीकृत करने की कोशिश की और मैं अभी भी वहां नहीं हूं:

दोनों उत्तरों के संयोजन का उपयोग करके मैं एक साथ यह हैक कर सकता हूं:

 library(ggplot) library(plyr) #make some example data dd<-data.frame(matrix(rnorm(108, mean=2, sd=2),36,2),c(rep("A",24),rep("B",24),rep("C",24))) colnames(dd) <- c("x_value", "Predicted_value", "State_CD") DevMeanSt <- ddply(dd, c("State_CD"), function(df)mean(df$Predicted_value)) colnames(DevMeanSt) <- c("State_CD", "mean") DevSdSt <- ddply(dd, c("State_CD"), function(df)sd(df$Predicted_value) ) colnames(DevSdSt) <- c("State_CD", "sd") DevStatsSt <- merge(DevMeanSt, DevSdSt) pg <- ggplot(dd, aes(x=Predicted_value)) pg <- pg + geom_density() pg <- pg + stat_function(fun=dnorm, colour='red', args=list(mean=DevStatsSt$mean, sd=DevStatsSt$sd)) pg <- pg + facet_wrap(~State_CD) print(pg) 

जो वास्तव में करीब है … कुछ छोड़कर सामान्य जिला साजिश रचने में गलत है:

यहां छवि विवरण दर्ज करें

मुझसे यहां क्या गलत हो रहा है?

वेब के समाधान से एकत्रित समाधान "stat_function और facet_wrap का उपयोग करके जीजीपीएल 22 में आर में"

stat_function प्रत्येक पैनल में समान फ़ंक्शन को ओवरले करने के लिए डिज़ाइन किया गया है। (विभिन्न पैनलों के साथ फ़ंक्शन के मापदंडों को मैच करने का कोई स्पष्ट तरीका नहीं है)

इयान के सुझाव के अनुसार, सबसे अच्छा तरीका है सामान्य घटता उत्पन्न करना, और उन्हें एक अलग डाटासेट के रूप में साजिश करना (यह वह जगह है जहाँ आप इससे पहले गलत थे – विलीन होकर इस उदाहरण के लिए कोई मतलब नहीं होता है और यदि आप सावधानी से देखते हैं देखो, आप अजीब नाटक पैटर्न क्यों पा रहे हैं)।

यहां बताया गया है कि मैं कैसे इस समस्या को हल करने के बारे में जाना चाहूंगा:

 dd <- data.frame( predicted = rnorm(72, mean = 2, sd = 2), state = rep(c("A", "B", "C"), each = 24) ) grid <- with(dd, seq(min(predicted), max(predicted), length = 100)) normaldens <- ddply(dd, "state", function(df) { data.frame( predicted = grid, density = dnorm(grid, mean(df$predicted), sd(df$predicted)) ) }) ggplot(dd, aes(predicted)) + geom_density() + geom_line(aes(y = density), data = normaldens, colour = "red") + facet_wrap(~ state) 

यहां छवि विवरण दर्ज करें

मुझे लगता है आपको अधिक जानकारी प्रदान करने की आवश्यकता है। यह काम करने लगता है:

  pg <- ggplot(dd, aes(Predicted_value)) ## need aesthetics in the ggplot pg <- pg + geom_density() ## gotta provide the arguments of the dnorm pg <- pg + stat_function(fun=dnorm, colour='red', args=list(mean=mean(dd$Predicted_value), sd=sd(dd$Predicted_value))) ## wrap it! pg <- pg + facet_wrap(~State_CD) pg 

हम प्रत्येक पैनल के लिए समान माध्य और एसडी पैरामीटर प्रदान कर रहे हैं। पैनल विशिष्ट साधन प्राप्त करना और मानक विचलन को पाठक * के लिए एक व्यायाम के रूप में छोड़ दिया जाता है;)

'*' दूसरे शब्दों में, सुनिश्चित नहीं कि यह कैसे किया जा सकता है …

मुझे लगता है कि आपकी सबसे अच्छी शर्त है कि रेखा को मैन्युअल रूप से geom_line के साथ खींचना है

 dd<-data.frame(matrix(rnorm(144, mean=2, sd=2),72,2),c(rep("A",24),rep("B",24),rep("C",24))) colnames(dd) <- c("x_value", "Predicted_value", "State_CD") dd$Predicted_value<-dd$Predicted_value*as.numeric(dd$State_CD) #make different by state ##Calculate means and standard deviations by level means<-as.numeric(by(dd[,2],dd$State_CD,mean)) sds<-as.numeric(by(dd[,2],dd$State_CD,sd)) ##Create evenly spaced evaluation points +/- 3 standard deviations away from the mean dd$vals<-0 for(i in 1:length(levels(dd$State_CD))){ dd$vals[dd$State_CD==levels(dd$State_CD)[i]]<-seq(from=means[i]-3*sds[i], to=means[i]+3*sds[i], length.out=sum(dd$State_CD==levels(dd$State_CD)[i])) } ##Create normal density points dd$norm<-with(dd,dnorm(vals,means[as.numeric(State_CD)], sds[as.numeric(State_CD)])) pg <- ggplot(dd, aes(Predicted_value)) pg <- pg + geom_density() pg <- pg + geom_line(aes(x=vals,y=norm),colour="red") #Add in normal distribution pg <- pg + facet_wrap(~State_CD,scales="free") pg 

यदि आप सामान्य वितरण लाइन-ग्राफ़ "हाथ से" जनरेट नहीं करना चाहते हैं, तो अभी भी stat_function का उपयोग करें, और साइड-बाय-साइड को दिखाएं – फिर आप "कुकबुक फॉर आर" पर प्रकाशित "मल्टीप्लॉट" फ़ंक्शन का उपयोग करने पर विचार कर सकते हैं। facet_wrap के विकल्प के रूप में आप यहां से प्रोजेक्ट को मल्टीप्लॉट कोड कॉपी कर सकते हैं ।

आपके द्वारा कोड की प्रतिलिपि करने के बाद, निम्नलिखित करें:

 # Some fake data (copied from hadley's answer) dd <- data.frame( predicted = rnorm(72, mean = 2, sd = 2), state = rep(c("A", "B", "C"), each = 24) ) # Split the data by state, apply a function on each member that converts it into a # plot object, and return the result as a vector. plots <- lapply(split(dd,dd$state),FUN=function(state_slice){ # The code here is the plot code generation. You can do anything you would # normally do for a single plot, such as calling stat_function, and you do this # one slice at a time. ggplot(state_slice, aes(predicted)) + geom_density() + stat_function(fun=dnorm, args=list(mean=mean(state_slice$predicted), sd=sd(state_slice$predicted)), color="red") }) # Finally, present the plots on 3 columns. multiplot(plotlist = plots, cols=3) 

यहां छवि विवरण दर्ज करें