2013-08-10 3 views
42

मुझे ggplot2 के साथ डेटा फ्रेम का सबसेट प्लॉट करने में कोई समस्या है। मेरा डीएफ इस प्रकार है:सबसेट और ggplot2

ID Value1 Value2 
P1 100 12 
P1 120 13 
... 
P2 300 11 
P2 400 16 
... 
P3 130 15 
P3 140 12 
... 

अब मैं आईडी 1 पी और पी 3 के लिए वैल्यू 1 बनाम वैल्यू 2 कैसे प्लॉट कर सकता हूं? उदाहरण के लिए मैंने कोशिश की:

ggplot(subset(df,ID=="P1 & P3") + geom_line(aes(Value1, Value2, group=ID, colour=ID))) 

लेकिन मुझे हमेशा एक त्रुटि प्राप्त होती है।

पेज। मैं भी पी 1 & पी 3 के साथ कई संयोजन की कोशिश की लेकिन मैं हमेशा विफल रही है ..

+0

'((आईडी ==" पी 1 ") | (आईडी ==" पी 3 ")) 'चाल –

+1

या आईडी% (" पी 1 "," पी 3 ") में' आईडी% हो सकता है। –

+0

@ हांग और @ लॉस्टब्रिट मैं दोनों आदेशों के लिए एक त्रुटि प्राप्त करता हूं: as.vector (x, mode) में त्रुटि: 'किसी भी' – matteo

उत्तर

52

यहाँ 2 subsetting के लिए विकल्प:

का उपयोग करना बेस R से subset:

library(ggplot2) 
ggplot(subset(dat,ID %in% c("P1" , "P3"))) + 
     geom_line(aes(Value1, Value2, group=ID, colour=ID)) 

subsetgeom_line का तर्क (नोट मैं विशेष . फ़ंक्शन का उपयोग करने के लिए plyr पैकेज का उपयोग कर रहा हूं) का उपयोग कर रहा हूं।

library(plyr) 
ggplot(data=dat)+ 
    geom_line(aes(Value1, Value2, group=ID, colour=ID), 
       ,subset = .(ID %in% c("P1" , "P3"))) 

तुम भी पूरक subsetting उपयोग कर सकते हैं:

subset(dat,ID != "P2") 
+1

यह काम करता है !! धन्यवाद। मुझे पता है कि मैं पूरक का उपयोग कर सकता हूं लेकिन मेरे असली डीएफ में 12 अलग-अलग आईडी मान हैं ... – matteo

+5

ध्यान दें कि विकल्प 2 बहिष्कृत/अब काम नहीं करता है। –

+2

यह जोड़ना उचित हो सकता है कि 'सबसेट' तर्क के मूल्यह्रास के बाद तुलनात्मक परिणाम 'geom_line (डेटा = डेटा [% c में"% $% ("पी 1", "पी 3"),] का उपयोग करके प्राप्त किए जा सकते हैं। ..) 'जैसा कि चर्चा की गई [यहां] (http://stackoverflow.com/a/34588455/1655567)। असल में यह नीचे [उत्तर] (http://stackoverflow.com/a/18165706/1655567) के आधार पर काम करता है। मामूली अंतर भू-कॉल के अंदर सबसेट किए गए डेटा का उपयोग कर रहा है। – Konrad

7

आप निम्नलिखित भूखंड के लिए देख रहे:

library(ggplot2) 
l<-df[df$ID %in% c("P1","P3"),] 
myplot<-ggplot(l)+geom_line(aes(Value1, Value2, group=ID, colour=ID)) 

enter image description here

+0

यह भी काम करता है .. मैं थोड़ा और अधिक जटिल "लेकिन अच्छी तरह से काम करता है। धन्यवाद! – matteo

3

आपका निर्माण लगभग सही है। आप चाहते हैं:

subset(dat, ID=="P1" | ID=="P3") 

कहाँ | ('पाइप') का अर्थ है 'या'। आपका समाधान, ID=="P1 & P3", वहाँ एक और समाधान है कि मैं उपयोगी पाते हैं, खासकर जब मैं एक ही वस्तु के कई सबसेट प्लॉट करने के लिए चाहते हैं एक मामले में जहां आईडी सचमुच है "P1 & P3"

6

की तलाश में है:

myplot<-ggplot(df)+geom_line(aes(Value1, Value2, group=ID, colour=ID)) 
myplot %+% subset(df, ID %in% c("P1","P3")) 
myplot %+% subset(df, ID %in% c("P2")) 
+0

उत्कृष्ट समाधान, बहुत आसान और एकाधिक भूखंडों के लिए बहुत उपयोगी है! – Toshiro

3
विकल्प 2 के साथ

@ agstudy के जवाब में अब बहिष्कृत, एक समारोह के साथ डेटा को परिभाषित करना आसान हो सकता है।

library(plyr) 
ggplot(data=dat) + 
    geom_line(aes(Value1, Value2, group=ID, colour=ID), 
      data=function(x){x$ID %in% c("P1", "P3")) 

यदि आप एक ही साजिश में डेटासेट का पुन: उपयोग करना चाहते हैं, तो यह दृष्टिकोण आसान है, उदाहरण के लिए आप data.frame में एक नया स्तंभ निर्दिष्ट करने के लिए नहीं करना चाहते हैं, या आप स्पष्ट रूप से अन्य .:

library(plyr) 
ggplot(data=dat, aes(Value1, Value2, group=ID, colour=ID)) + 
    geom_line(data=function(x){x[!x$ID %in% c("P1", "P3"), ]}, alpha=0.5) + 
    geom_line(data=function(x){x[x$ID %in% c("P1", "P3"), ]}) 
0

कोशिश फिल्टर के ऊपर एक परत में एक डाटासेट प्लॉट करने के लिए पी 1 और पी 3 का केवल पंक्तियों सबसेट को चाहते हैं

df2 <- filter(df, ID == "P1" | ID == "P3") 

से अधिक प्लॉट वैल्यू 1 हो सकता है। बनाम मूल्य 2।