दिलचस्प पोस्ट
उपयोगकर्ताओं को डेवलसे के लिए प्रोफाइल मॉडल? जावास्क्रिप्ट और regex: विभाजित स्ट्रिंग और विभाजक रखें स्क्रॉल डाउन पर फ़ेड इन करें, फलक आउट ऑन स्क्रॉल अप – विंडो में तत्व की स्थिति के आधार पर Ggplot2 में पहलुओं के पूर्ण आकार को सेट करना Django में manage.py CLI के साथ डेटाबेस से सभी तालिकाओं को कैसे छोड़ सकता है? संकलन "के साथ स्थानांतरण R_X86_64_32` .rodata.str1.8 'के साथ विफल हो सकता है जब साझा ऑब्जेक्ट बनाने में नहीं किया जा सकता " यह घटाव शून्य के समान क्यों नहीं है? Google OAuth2 प्राधिकृत OAuth टोकन त्रुटि: redirect_uri_mismatch ग्रहण: मुझे एंड्रॉइड एसडीके का इस्तेमाल करने नहीं देंगे, गलत तरीके से मेरे एडीटी का दावा है PHP लॉग को त्रुटि लॉग कहां रखता है? (पीपी 5, अपाचे, फास्टसीजी, सीपैनल) एंड्रॉइड स्टूडियो में * .so पुस्तकालय कैसे शामिल करें? जीमेल शैली सूचीदृश्य कैसे `git लॉग इनवर्वर करें –grep = <pattern>` या git लॉग को दिखाने के लिए जो एक पैटर्न से मेल नहीं खाते एचटीएमएल में त्रि-स्टेट चेक बॉक्स? JQuery में टेक्स्ट स्ट्रिंग खोजें और इसे बोल्ड करें

आर में एक अन्य समारोह के भीतर ggplot () का उपयोग करें

मैं ggplot2 लाइब्रेरी का उपयोग करके, एक सरल साजिश फ़ंक्शन लिखने की कोशिश कर रहा हूं। लेकिन ggplot को कॉल फंक्शन तर्क नहीं मिल रहा है।

माना जाता means कि एक data.frame पर विचार करें कि दो स्थितियों और दो मतलब मान जो कि मैं साजिश करना चाहता हूं (स्थिति एक्स अक्ष पर दिखाई देगी, इसका अर्थ वाई पर है)।

 library(ggplot2) m <- c(13.8, 14.8) cond <- c(1, 2) means <- data.frame(means=m, condition=cond) means # The output should be: # means condition # 1 13.8 1 # 2 14.8 2 testplot <- function(meansdf) { p <- ggplot(meansdf, aes(fill=meansdf$condition, y=meansdf$means, x = meansdf$condition)) p + geom_bar(position="dodge", stat="identity") } testplot(means) # This will output the following error: # Error in eval(expr, envir, enclos) : object 'meansdf' not found 

तो ऐसा लगता है कि ggplot eval बुला रहा है, जो तर्क meansdf नहीं मिल सकता है क्या किसी को पता है कि मैं ggplot को फ़ंक्शन तर्क को सफलतापूर्वक कैसे पारित कर सकता हूं?

(ध्यान दें: हां, मैं सीधे जीजीप्लोट फ़ंक्शन को सीधे कॉल कर सकता था, लेकिन अंत में मुझे उम्मीद है कि मेरा प्लॉट फंक्शन अधिक जटिल सामान बनाती है! :))

Solutions Collecting From Web of "आर में एक अन्य समारोह के भीतर ggplot () का उपयोग करें"

जैसा कि जॉरीस और चेस ने पहले से ही सही उत्तर दिया है, मानक सर्वोत्तम अभ्यास केवल meansdf$ हिस्सा meansdf$ और सीधे डेटा फ्रेम कॉलम को देखें।

 testplot <- function(meansdf) { p <- ggplot(meansdf, aes(fill = condition, y = means, x = condition)) p + geom_bar(position = "dodge", stat = "identity") } 

यह काम करता है, क्योंकि aes में वर्णित वेरिएबल वैश्विक वातावरण में या ggplot को पास किए गए डेटा फ़्रेम में ggplot । यह भी यही कारण है कि आपका उदाहरण meansdf$condition का उपयोग कर meansdf$condition आदि – काम नहीं किया है: meansdf न ही वैश्विक वातावरण में उपलब्ध है, न ही यह meansdf को पास किए गए डेटा फ़्रेम के अंदर उपलब्ध है, जो कि meansdf ही है


तथ्य यह है कि कॉलिंग पर्यावरण के बजाय वैरिएबल को वैश्विक परिवेश में देखा जाता है वास्तव में ggplot2 में एक ज्ञात बग है कि इस समय हाडले ने तय नहीं किया है। इससे समस्याएं हो सकती हैं, यदि कोई साजिश के लिए उपयोग किए जाने वाले डेटा को प्रभावित करने के लिए एक स्थानीय चर, कहना, scale का उपयोग करना चाहता है:

 testplot <- function(meansdf) { scale <- 0.5 p <- ggplot(meansdf, aes(fill = condition, y = means * scale, # does not work, since scale is not found x = condition)) p + geom_bar(position = "dodge", stat = "identity") } 

इस मामले के लिए एक बहुत ही अच्छा समाधान संदर्भित गीथहब मुद्दे में विंस्टन चांग द्वारा मुहैया कराया गया है: स्पष्ट रूप से ggplot को कॉल के दौरान मौजूदा वातावरण में environment पैरामीटर सेट करना। यहां बताया गया है कि उपरोक्त उदाहरण के लिए क्या होगा:

 testplot <- function(meansdf) { scale <- 0.5 p <- ggplot(meansdf, aes(fill = condition, y = means * scale, x = condition), environment = environment()) # This is the only line changed / added p + geom_bar(position = "dodge", stat = "identity") } ## Now, the following works testplot(means) 

मुझे नहीं लगता कि आपको अपने फ़ंक्शन कॉल में meansdf$ हिस्सा शामिल करना meansdf$ । यह मेरी मशीन पर काम करता है:

 meansdf <- data.frame(means = c(13.8, 14.8), condition = 1:2) testplot <- function(meansdf) { p <- ggplot(meansdf, aes(fill=condition, y=means, x = condition)) p + geom_bar(position="dodge", stat="identity") } testplot(meansdf) 

उत्पादन करना:

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

aes_string() का प्रयोग करने का "उचित" तरीका aes() बजाय aes_string() का उपयोग करना है और वस्तुओं के बजाए कॉलम के नामों को वर्णों के रूप में उपयोग करना है:

अधिक प्रोग्रामेटिक उपयोगों के लिए, उदाहरण के लिए यदि आप चाहते हैं कि उपयोगकर्ता विभिन्न सौंदर्यशास्त्रों के लिए स्तंभ नामों को तर्क के रूप में निर्दिष्ट करने में सक्षम हों, या यदि यह फ़ंक्शन किसी ऐसे पैकेज में जा रहा हो जिसे R CMD CHECK को परिभाषित किए बिना चर नामों के बिना चेतावनी के पास करना पड़ सकता है, तो आप aes_string() उपयोग करें, जिसमें वर्ण के रूप में आवश्यक है

 testplot <- function(meansdf, xvar = "condition", yvar = "means", fillvar = "condition") { p <- ggplot(meansdf, aes_string(x = xvar, y= yvar, fill = fillvar)) + geom_bar(position="dodge", stat="identity") } 

यहां एक साधारण चाल है जो मैं अपने फ़ंक्शन पर्यावरण (दूसरी पंक्ति) में मेरे चर को परिभाषित करने के लिए बहुत उपयोग करता हूं:

 FUN <- function(fun.data, fun.y) { fun.data$fun.y <- fun.data[, fun.y] ggplot(fun.data, aes(x, fun.y)) + geom_point() + scale_y_continuous(fun.y) } datas <- data.frame(x = rnorm(100, 0, 1), y = x + rnorm(100, 2, 2), z = x + rnorm(100, 5, 10)) FUN(datas, "y") FUN(datas, "z") 

नोट करें कि जब भिन्न-भिन्न चर या डेटा-सेट का उपयोग किया जाता है तो y-axis लेबल भी बदलता है।

यह एक ऐसी समस्या का उदाहरण है जिसे पहले चर्चा की गई है। असल में, यह वैश्विक पर्यावरण में मुख्य रूप से उपयोग के लिए कोडित किया गया ggplot2 के लिए नीचे आता है। एईएस () कॉल में, वैरिएबल वैश्विक परिवेश में या निर्दिष्ट डेटाफ्रेम के भीतर के लिए देखा जाता है।

 library(ggplot2) means <- data.frame(means=c(13.8,14.8),condition=1:2) testplot <- function(meansdf) { p <- ggplot(meansdf, aes(fill=condition, y=means, x = condition)) p + geom_bar(position="dodge", stat="identity") } 

संपादित करें:

अद्यतन: अन्य जवाब और ggplot2 पैकेज को अद्यतन करने के बाद , ऊपर दिए गए कोड काम करता है कारण, टिप्पणियों में बताया गया है कि जीजीप्लोट वैश्विक परिवेश में (जब डेटाफ्रेम विशेष रूप से मेंडफ $ …) या उल्लिखित वातावरण के रूप में जोड़ा जाता है, एईएस में चर के लिए दिखेगा।

इसके लिए, सुनिश्चित करें कि आप ggplot2 के नवीनतम संस्करण के साथ काम करते हैं।

यह कुछ समय के लिए मुझे निराश किया मैं विभिन्न वैरिएबल नामों के साथ अलग-अलग डेटा फ्रेम भेजना चाहता था और मैं डेटा फ्रेम से अलग-अलग स्तंभों को साजिश करने की क्षमता चाहता था। मुझे आखिरकार कुछ डमी (ग्लोबल) वेरिएबल्स बनाकर कार्य मिल गया, जो फंक्शन के अंदर काम करने के लिए प्लॉटिंग और मजबूर करने के लिए तैयार हो गए

 plotgraph function(df,df.x,df.y) { dummy.df <<- df dummy.x <<- df.x dummy.y <<- df.y p = ggplot(dummy.df,aes(x=dummy.x,y=dummy.y,.....) print(p) } 

तो मुख्य कोड में मैं फ़ंक्शन कॉल कर सकता हूं

 plotgraph(data,data$time,data$Y1) plotgraph(data,data$time,data$Y2) 

संक्षिप्त उत्तर: qplot का प्रयोग करें

लंबे उत्तर: संक्षेप में आप ऐसा कुछ चाहते हैं:

 my.barplot <- function(x=this.is.a.data.frame.typically) { # R code doing the magic comes here ... } 

लेकिन इसमें लचीलेपन की कमी है क्योंकि आपको कष्टप्रद आर स्कोप आईडीओसिनक्रैसिज़ से बचने के लिए लगातार कॉलम नामकरण करना चाहिए। बेशक अगले तर्क चरण है:

 my.barplot <- function(data=data.frame(), x=..., y....) { # R code doing something really really magical here ... } 

लेकिन फिर यह संदेहपूर्वक लग रहा है जैसे कि qplot () को कॉल करना सही है?

 qplot(data=my.data.frame, x=some.column, y=some.other column, geom="bar", stat="identity",...) 

बेशक अब आप बड़े पैमाने पर खिताब की तरह चीजें बदलना चाहते हैं, लेकिन इसके लिए एक समारोह आसान हो जाता है … अच्छी खबर यह है कि स्क्रॉपिंग के मुद्दे ज्यादातर चले गए हैं

 my.plot <- qplot(data=my.data.frame, x=some.column, y=some.other column,...) set.scales(p, xscale=scale_X_continuous, xtitle=NULL, yscale=scale_y_continuous(), title=NULL) { return(p + xscale(title=xtitle) + yscale(title=ytitle)) } my.plot.prettier <- set.scale(my.plot, scale_x_discrete, 'Days', scale_y_discrete, 'Count') 

एईएस (…) को अपने फ़ंक्शन के एक चर के रूप में परिभाषित करना एक और वैकल्पिक हल है:

 func<-function(meansdf, aes(...)){} 

यह एक समान विषय पर मेरे लिए अभी ठीक काम किया है

मैं फ़ंक्शन के अंदर वांछित नामों के साथ नए डेटा फ़्रेम चर उत्पन्न करता हूं:

 testplot <- function(df, xVar, yVar, fillVar) { df$xVar = df[,which(names(df)==xVar)] df$yVar = df[,which(names(df)==yVar)] df$fillVar = df[,which(names(df)==fillVar)] p <- ggplot(df, aes(x=xvar, y=yvar, fill=fillvar)) + geom_bar(position="dodge", stat="identity") } 

आपको कुछ फैंसी की ज़रूरत नहीं है। डमी वैरिएबल भी नहीं। आपको केवल अपने फ़ंक्शन के अंदर प्रिंट () जोड़ना होगा, जब आप कंसोल में कुछ दिखाना चाहते हैं तो बिल्ली () का उपयोग करने की तरह है

myplot <- ggplot (……) + जो कुछ भी आप चाहते हैं वह प्रिंट (मायप्लॉट)

यह मेरे लिए एक ही समारोह में एक से अधिक समय के लिए काम किया