2012-04-14 7 views
36

में लेबल कैसे बदलें मेरे पास बड़ी संख्या में डेटा श्रृंखला है जिसे मैं छोटे गुणकों का उपयोग करके साजिश करना चाहता हूं। Ggplot2 और facet_wrap का संयोजन जो मैं चाहता हूं, आमतौर पर 6 x 6 पहलुओं का एक अच्छा छोटा ब्लॉक होता है। यहाँ एक सरल संस्करण है:facet_grid में कॉलम कैसे निर्दिष्ट करें या facet_wrap

facet_wrap

समस्या यह है कि मैं पहलू स्ट्रिप्स में लेबल पर पर्याप्त नियंत्रण नहीं है। डेटा फ्रेम में कॉलम के नाम कम हैं और मैं उन्हें इस तरह से रखना चाहता हूं, लेकिन मैं चाहता हूं कि पहलुओं में लेबल अधिक वर्णनात्मक हों। मैं facet_grid का उपयोग कर सकता हूं ताकि मैं labeller फ़ंक्शन का लाभ उठा सकूं लेकिन फिर कॉलम की संख्या निर्दिष्ट करने और पहलुओं की एक लंबी पंक्ति निर्दिष्ट करने का कोई सीधा तरीका नहीं है, यह इस विशेष कार्य के लिए काम नहीं करता है। क्या मुझसे साफ़ - साफ़ कुछ चीज़ चूक रही है?

facet_grid

प्र जब कॉलम के नाम बदल के बिना facet_wrap का उपयोग कर रहा पहलू लेबल बदल सकते हैं? वैकल्पिक रूप से, facet_grid का उपयोग करते समय मैं कॉलम और पंक्तियों की संख्या कैसे निर्दिष्ट कर सकता हूं?

एक सरलीकृत उदाहरण के लिए कोड निम्नानुसार है। वास्तविक जीवन में मैं कई समूहों से निपट रहा हूं जिनमें दर्जनों डेटा श्रृंखला शामिल हैं, जिनमें से प्रत्येक अक्सर बदलती है, इसलिए मैन्युअल रूप से मूल्यों को मैन्युअल रूप से निर्दिष्ट करने के बजाय किसी भी समाधान को स्वचालित करना होगा।

require(ggplot2) 
require(reshape) 

# Random data with short column names 
set.seed(123) 
myrows <- 30 
mydf <- data.frame(date = seq(as.Date('2012-01-01'), by = "day", length.out = myrows), 
        aa = runif(myrows, min=1, max=2), 
        bb = runif(myrows, min=1, max=2), 
        cc = runif(myrows, min=1, max=2), 
        dd = runif(myrows, min=1, max=2), 
        ee = runif(myrows, min=1, max=2), 
        ff = runif(myrows, min=1, max=2)) 

# Plot using facet wrap - we want to specify the columns 
# and the rows and this works just fine, we have a little block 
# of 2 columns and 3 rows 

mydf <- melt(mydf, id = c('date')) 

p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) + 
    geom_line() + 
    facet_wrap(~ variable, ncol = 2) 
print (p1) 

# Problem: we want more descriptive labels without changing column names. 
# We can change the labels, but doing so requires us to 
# switch from facet_wrap to facet_grid 
# However, in facet_grid we can't specify the columns and rows... 

mf_labeller <- function(var, value){ # lifted bodily from the R Cookbook 
    value <- as.character(value) 
    if (var=="variable") { 
     value[value=="aa"] <- "A long label" 
     value[value=="bb"] <- "B Partners" 
     value[value=="cc"] <- "CC Inc." 
     value[value=="dd"] <- "DD Company" 
     value[value=="ee"] <- "Eeeeeek!" 
     value[value=="ff"] <- "Final" 
    } 
    return(value) 
} 

p2 <- ggplot(mydf, aes(y = value, x = date, group = variable)) + 
    geom_line() + 
    facet_grid(~ variable, labeller = mf_labeller) 
print (p2) 
+4

यह एक [खुली समस्या] है (https://github.com/hadley/ggplot2/issues/25), लेकिन आपके विशेष मामले में (सरल नामकरण, कोई bquote या plotmath) आप पहले से ही चर का नाम बदल सकते हैं। – baptiste

+1

@baptiste मुझे इस बात से अवगत नहीं था कि यह एक खुला मुद्दा था (और अब दो साल से ऐसा ही रहा है, इसलिए जल्द ही किसी भी समय बदलने की संभावना नहीं है)। संदिग्ध हैडली को परियोजना पर रखने के लिए और अधिक ग्रेड छात्रों की जरूरत है! – SlowLearner

+1

या आर-समझदार स्वयंसेवक – baptiste

उत्तर

19

मुझे समझ में नहीं आता है। आपने पहले से ही एक फ़ंक्शन लिखा है जो आपके छोटे लेबल को लंबे, वर्णनात्मक लेबल में परिवर्तित करता है। बस एक नया कॉलम जोड़ने और उस कॉलम पर facet_wrap का उपयोग करने में क्या गलत है?

mydf <- melt(mydf, id = c('date')) 
mydf$variableLab <- mf_labeller('variable',mydf$variable) 

p1 <- ggplot(mydf, aes(y = value, x = date, group = variable)) + 
    geom_line() + 
    facet_wrap(~ variableLab, ncol = 2) 
print (p1) 
+8

नया कॉलम जोड़ने में कुछ भी गलत नहीं - मेरा दिमाग उस आखिरी कदम से पहले छोड़ दिया! मुझे ऐसा करने के लिए जाना चाहिए था। "यदि संदेह है, तो डेटा फ्रेम में कॉलम जोड़ें" ggplot के लिए व्यावहारिक रूप से डिफ़ॉल्ट सहायता कथन है। धन्यवाद। – SlowLearner

+0

कृपया मदद करें, मैं इस फ़ंक्शन का उपयोग कर रहा हूं और निम्न त्रुटि कहती है: 'यदि (variable == मान) {: स्थिति में लंबाई> 1 है और केवल पहला तत्व उपयोग किया जाएगा' जहां 'variableLab' के 0 तत्व हैं निष्पादन के बाद। –

+0

मुझे लगता है कि अगर आप अपनी त्रुटि – alily

8

लेबल का नाम बदलने के लिए बस कारक आप facet_wrap में उपयोग के कारक स्तर बदलने। इन्हें स्ट्रिप्स पर facet_wrap में उपयोग किया जाएगा। आप फ़ंक्शन facet_grid में फ़ंक्शन का उपयोग करने के समान ही सेटअप का उपयोग कर सकते हैं।

new_labels = sapply(levels(df$factor_variable), custom_labeller_function) 
df$factor_variable = factor(df$factor_variable, levels = new_labels) 

अब आप facet_wrap में factor_variable उपयोग कर सकते हैं: बस की तरह कुछ है।

+0

को दूर करने के लिए अपने डेटाफ्रेम की लंबाई के लिए एक लूप में (चर [i] == मान [i]) का उपयोग करना चाहते हैं, तो यह भी एक उपयोगी दृष्टिकोण है। – SlowLearner

संबंधित मुद्दे