Ggplot में कॉलम नाम निर्दिष्ट करने के लिए एक चर का उपयोग कैसे करें


105

मेरे पास एक ggplot कमांड है

ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )

एक समारोह के अंदर। लेकिन मैं रंग और समूह के रूप में उपयोग करने के लिए कॉलम को चुनने के लिए फ़ंक्शन के एक पैरामीटर का उपयोग करने में सक्षम होना चाहूंगा। यानी मैं ऐसा कुछ चाहूंगा

f <- function( column ) {
    ...
    ggplot( rates.by.groups, aes(x=name, y=rate, colour= ??? , group=??? ) )
}

ताकि ggplot में प्रयुक्त कॉलम पैरामीटर द्वारा निर्धारित किया जाता है। उदाहरण के लिए f ("माजर") का प्रभाव हमें मिलता है

ggplot( rates.by.groups, aes(x=name, y=rate, colour=majr, group=majr) )

लेकिन एफ ("लिंग") के लिए हमें इसका प्रभाव मिलता है

  ggplot( rates.by.groups, aes(x=name, y=rate, colour=gender, group=gender) )

कुछ चीजें जो मैंने कोशिश कीं:

ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ) )

काम नहीं किया। और न ही किया

e <- environment() 
ggplot( rates.by.groups, aes(x=name, y=rate, colour= columnName , group=columnName ), environment=e )

जवाबों:


161

आप उपयोग कर सकते हैं aes_string:

f <- function( column ) {
    ...
    ggplot( rates.by.groups, aes_string(x="name", y="rate", colour= column,
                                        group=column ) )
}

जब तक आप फ़ंक्शन को स्ट्रिंग ( f("majr")बजाय f(majr)) के रूप में कॉलम पास करते हैं । यह भी ध्यान दें कि हमने अन्य स्तंभों को बदल दिया है, "name"और "rate", तार होने के लिए।

यदि किसी कारण से आप इसका उपयोग नहीं करेंगे aes_string, तो आप इसे (कुछ अधिक बोझिल) कर सकते हैं:

    ggplot( rates.by.groups, aes(x=name, y=rate, colour= get(column),
                                        group=get(column) ) )

यह कहने योग्य है कि आप ऐसा नहीं कर सकते / नहीं कर सकते aes_string(x = rates.by.groups$name..., और वैसे भी आपको तब तक ज़रूरत नहीं है जब आप पहले ही ggplot(data = rates.by.groups...तर्क पारित कर चुके हैं। ( इस प्रश्न में मुद्दा )
3

3
Ggplot2 संस्करण 3.0.0 के लिए अपडेट के साथ मूडी_मडस्कीपर के जवाब के लिए लोगों को इंगित करने के लिए बस एक नोट जोड़ना
ग्रेग थॉमस थॉमस

@buncis यह सच नहीं है, उद्धृत "column_name"या "column"काम नहीं करेगा
डेविड रॉबिन्सन

@DavidRobinson को मेरी गलती पर खेद है, मुझे नहीं लगता कि कोड किसी फ़ंक्शन पर पैरामीटर के साथ लिपटा हुआ है, मेरी टिप्पणी को हटाने वाला है
buncis

"बोझिल"? R में गैर-मानक मूल्यांकन विडंबना यह है कि सबसे अधिक बोझिल "सुविधा" मैंने कभी भी एक प्रोग्रामिंग भाषा में सामना किया है। सच में पागल।
jessexknight

44

के जारी नोटों से ggplot2 V3.0.0:

anes () अब quasiquotation का समर्थन करता है ताकि आप !!, !!!, और: = का उपयोग कर सकें। यह aes_ () और anes_string () की जगह लेता है जो अब नरम हो गए हैं (लेकिन लंबे समय तक आसपास रहेंगे)।

मुहावरेदार तरीका अब उस स्ट्रिंग के प्रतीक को बदलना होगा जिसमें चर शामिल है, का उपयोग करते हुए sym()(जो कि आधार एलियास as.name()/ के रूप में लगभग समान है as.symbol()), और इसका उपयोग करके इसे अनचेक करें!!

ओपी के डेटा का अनुकरण हम कर सकते हैं:

library(tidyverse)
rates.by.groups <- data.frame(
  name = LETTERS[1:3],
  rate = 1:3,
  mjr = LETTERS[c(4,4,5)],
  gender = c("M","F","F")
)

f <- function(column) {
  column <- sym(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()
}

f("gender")
f("mjr")
x <- "gender"
f(x)

यदि हम कार्य कर सकते हैं तो हम कच्चे नामों को फीड करेंगे:

f2 <- function(column) {
  column <- ensym(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()
}

यह उर्फ ​​प्रतीकों और स्ट्रिंग शाब्दिक नामों के साथ काम करेगा

f2(gender)
f2(mjr)
f2("gender")
f2("mjr")

जैसा कि लियोनेल कहते हैं ensym():

यह उन तर्कों के वाक्य-विन्यास की नकल करने के लिए है, जहाँ आप LHS, उदाहरण सूची (नंगे = 1, "उद्धृत" = 2) दोनों में आपूर्ति कर सकते हैं


पर ध्यान दें enquo()

enquo()तर्क को दिए गए अभिव्यक्ति (जरूरी नहीं कि एक प्रतीक) को उद्धृत करता है, यह एक स्ट्रिंग शाब्दिक को प्रतीक में परिवर्तित नहीं ensym()करता है क्योंकि ऐसा यहां कम अनुकूलित हो सकता है, लेकिन हम कर सकते हैं:

f3 <- function(column) {
  column <- enquo(column)
  ggplot(rates.by.groups, 
         aes(x = name, 
             y = rate, 
             fill  = !!column, 
             group = !!column)) +
    geom_col()
}

f3(gender)
f2(mjr)

12
इस tidyeval सामान इतना कष्टप्रद है। aes()खुद के लिए प्रलेखन के बारे में बात enquo()करता है, लेकिन यह काम नहीं करता है। और जिसने ensym()पहले सुना है ? बड़ी
जगहें

@Moody_Mudskipper इसके लिए f2, सभी चार उदाहरण काम करते हैं, और इसलिए एक चर (यानी aname <- "mjr"; f2(aname)) में कॉलम का नाम कैप्चर करता है । यदि मैं डेटा फ़्रेम में हेरफेर करने के लिए कोड जोड़ता हूं तो dplyrयह चर नाम का उपयोग करके स्तंभ खोजने का प्रयास करता है और चर नाम में स्ट्रिंग नहीं। दूसरे शब्दों में, मैं कैसे rates.by.groups %>% group_by(!!column)...काम कर सकता हूं और अभी भी कॉल करने के तीन तरीकों का समर्थन कर सकता हूं f2?
स्टीव

1
"तो एक चर में स्तंभ नाम कैप्चरिंग करता है": यह विफल नहीं होता है लेकिन यह उसी परिणाम को वापस नहीं करता है, ensymनाम के रूप में प्रदान किए गए तर्कों से निपटने के लिए डिज़ाइन किया गया है, और उनके चारों ओर उद्धरण सहन करते हैं। मेरा मानना ​​है कि आप तर्क को एक नाम के रूप में मानेंगे, और यदि नाम नहीं मिला है तो मूल्य पर वापस गिरना चाहते हैं। यह वास्तव में क्या होता है select, लेकिन इसके साथ नहीं group_by... इसके चारों ओर हैक करना संभव है लेकिन स्पष्ट नहीं है। अगर यह आपके लिए महत्वपूर्ण है, तो मुझे लगता है कि यह अपने प्रश्न के लायक होगा।
मूडी_मडस्किपर

@Moody_Mudskipper साभार मैं दोनों का उपयोग कर रहा था selectऔर group_byइसलिए यह मुद्दा था। मैं एक नया प्रश्न बना सकता हूं, लेकिन मुझे एक सरल उदाहरण के साथ आने की जरूरत है और यह देखने के लिए जांचें कि क्या इसका उत्तर दिया गया है। मैं इसे पोस्ट कर सकता हूं अगर नहीं।
स्टीवेब

कैसे इस्तेमाल करे !! के मामले में facet_grid? यह साथ काम करता है facet_grid(cols = vars(!!column)), लेकिन साथ एक त्रुटि फेंकता हैfacet_grid(~ !!column)
mRiddle

14

के aes_stringबजाय का उपयोग करने का प्रयास करें aes


5
यह बहुत अच्छी सलाह है लेकिन क्या आप उन्हें बता सकते हैं कि क्यों? aes_string आपको गैर-चर के लिए "" उपयोग करता है और आप चर का उपयोग करते हैं। aes_string (x = "foo", y = "शुल्क", समूह = चर)
mtelesha

@ मुल्तेशा शायद इसलिए कि चर के मूल्य के रूप में स्ट्रिंग है
बंकिस

10

एक अन्य विकल्प ( ggplot2 > 3.0.0) डेटा फ्रेम .dataसे चुने हुए चर / कॉलम को स्लाइस करने के लिए सुव्यवस्थित मूल्यांकन सर्वनाम का उपयोग करना है rates.by.groups

library(ggplot2)
theme_set(theme_classic(base_size = 14))

# created by @Moody_Mudskipper
rates.by.groups <- data.frame(
  name = LETTERS[1:3],
  rate = 1:3,
  mjr = LETTERS[c(4, 4, 5)],
  gender = c("M", "F", "F")
)

f1 <- function(df, column) {
  gg <- ggplot(df, 
         aes(x = name, 
             y = rate, 
             fill  = .data[[column]], 
             group = .data[[column]])) +
    geom_col() +
    labs(fill = column)
  return(gg)
}

plot_list <- lapply(list("gender", "mjr"), function(x){ f1(rates.by.groups, x) })
plot_list
#> [[1]]

#> 
#> [[2]]

# combine all plots
library(egg)
ggarrange(plots = plot_list,
          nrow = 2,
          labels = c('A)', 'B)'))

2019-04-04 को रेप्रेक्स पैकेज (v0.2.1.9000) द्वारा बनाया गया


1

उपयोग aes_stringकरने से यह समस्या ठीक हो जाती है, लेकिन त्रुटि बार जोड़ते समय किसी समस्या का सामना करना पड़ता है geom_errorbar। नीचे एक सरल उपाय है।

#Identify your variables using the names of your columns indie your dataset
 xaxis   <- "Independent"   
 yaxis   <- "Dependent"
 sd      <- "error"

#Specify error bar range (in 'a-b' not 'a'-'b')
 range   <- c(yaxis, sd)                                #using c(X, y) allows use of quotation marks inside formula
 yerrbar <- aes_string(ymin=paste(range, collapse='-'), 
                       ymax=paste(range, collapse='+'))


#Build the plot
  ggplot(data=Dataset, aes_string(x=xaxis, y=yaxis)) +
    geom_errorbar(mapping=yerrbar, width=15, colour="#73777a", size = 0.5) +
    geom_point   (shape=21)

बोनस, आप ggplot के अंदर इन पंक्तियों का उपयोग करके अपने भूखंड में पहलू जोड़ सकते हैं:

facet_grid(formula(paste(Variable1, "~", Variable2)))

इस स्क्रिप्ट को इस मूल पोस्ट से संशोधित किया गया था: ggplot2 - कस्टम फ़ंक्शन का उपयोग करके त्रुटि बार


0

यहाँ एक अत्यंत सरल उदाहरण है।

बस दो काम करो

  1. स्ट्रिंग को प्रतीक में बदल दें
  2. !!जब आप इसका उपयोग करें तब जोड़ें
select_col <- sym("Petal.Length")

iris %>% 
  ggplot(aes(x = Sepal.Length, y = !!select_col)) +
  geom_point()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.