2013-11-21 7 views
6

के फ़ंक्शन पर फ़ेसटिंग ggplot2 में इसका उत्तर नहीं मिला, क्या कॉलम के मान के बजाय कॉलम के फ़ंक्शन पर फ़ंक्शन करना संभव है?ggplot2: कॉलम

सरल प्रतिलिपि प्रस्तुत करने योग्य उदाहरण:

नमूना डेटा:

df=data.frame(dat=c(1,2,5,5,7)) 

यह काम करता है:

ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
     geom_point() + facet_grid(dat ~ .) 

यह नहीं करता है:

ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
     geom_point() + facet_grid((dat > 3) ~ .) 

एक समाधान एक स्तंभ जोड़ने के लिए है बस के लिए पहलू। यह काम करता है:

df$facet=df$dat>3 
ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
     geom_point() + facet_grid(facet ~ .) 

लेकिन डेटा.फ्रेम पर नया कॉलम जोड़ने के बिना ऐसा करने का कोई तरीका है?

+3

नया कॉलम जोड़ने में समस्या क्या है? मैं अपेक्षा करता हूं कि देशी आर कार्यों और वेक्टरनाइज़ेशन का लाभ लेने के कारण एक नया कॉलम जोड़ना तेज हो। – Raffael

+2

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

+1

मुझे आपकी बात मिलती है - मैं भी वहां रहा हूं - लेकिन दिन के अंत में यह सिर्फ एक कॉस्मेटिकल मुद्दा है और यदि आप मुझसे पूछते हैं, जितना मैं आर का आनंद लेता हूं, यह डिजाइन द्वारा एक सुरुचिपूर्ण भाषा है - इसका उद्देश्य है नौकरी अच्छी तरह से करने के लिए, लेकिन सुंदरता से नहीं। – Raffael

उत्तर

2

मैं एक समझौता समाधान के साथ आया हूं, जो टिप्पणी अनुभाग में पोस्ट @Nathan और @ Яaffael के तर्कों के बीच एक व्यापार-बंद है।

FacetingFunction <- function(df) {df$dat > 3} 
ArbitraryFacetingPlot <- function(df, FacetingFunction) { 
    df$facet <- FacetingFunction(df) 
    p <- ggplot(df, aes(x=1:5, y=dat, colour=factor(dat > 3))) + 
    geom_point() + 
    facet_grid(facet ~ .) 
    df$facet <- NULL 
    p 
} 

ArbitraryFacetingPlot(df, FacetingFunction) 
ArbitraryFacetingPlot(df, function(df) {df$dat==5})