2013-08-10 20 views
42

Ho un problema per tracciare un sottoinsieme di un frame di dati con ggplot2. Il mio df è come:Sottoinsieme e ggplot2

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

Come posso ora tracciare Value1 vs Valore2 solo per gli ID P1 e P3? Per esempio ho provato:

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

ma ricevo sempre un errore.

p.s. Ho provato anche molti combinazione con P1 & P3 ma ho sempre fallito ..

+0

'((ID ==" P1 ") | (ID ==" P3 "))' potrebbe fare il trucco –

+1

O ID% in% c ("P1", "P3") '. –

+0

@Hong e @ LostBrit Ricevo per entrambi i comandi un errore: Errore in as.vector (x, modalità): non può forzare il tipo 'ambiente' al vettore di tipo 'any' – matteo

risposta

52

Qui 2 opzioni per sottoinsiemi:

Utilizzando subset dalla base R:

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

Utilizzo di subset l'argomento di geom_line (Nota Sto utilizzando il pacchetto plyr per utilizzare la funzione speciale .).

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

È anche possibile utilizzare il sottoinsiemi complementari:

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

Funziona !! Grazie. So che posso usare il complementare, ma il mio vero df ha 12 diversi valori ID ... – matteo

+5

Nota che l'opzione 2 è deprecata/non funziona più. –

+2

Potrebbe valere la pena di aggiungere che dopo il deprezzamento dell'argomento 'sottoinsieme' i risultati comparabili potrebbero essere ottenuti usando' geom_line (data = dat [dat $ ID% in% c ("P1", "P3"),],. ..) 'come discusso [qui] (http://stackoverflow.com/a/34588455/1655567). In effetti funziona sulla stessa base di [la risposta] (http://stackoverflow.com/a/18165706/1655567) qui sotto. La piccola differenza sta nell'utilizzare i dati sottostanti all'interno della chiamata geom. – Konrad

7

Siete alla ricerca per il seguente grafico:

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

Funziona anche .. Io sono un po 'più "complicato" ma funziona bene. Grazie! – matteo

3

vostra formulazione è quasi corretto. Si desidera:

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

Dove il | ('pipe') significa 'o'. La soluzione, ID=="P1 & P3", è alla ricerca di un caso in cui ID è letteralmente "P1 & P3"

6

C'è un'altra soluzione che trovo utile, soprattutto quando voglio per tracciare più sottoinsiemi dello stesso oggetto:

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

Ottima soluzione, molto semplice e molto utile per più trame! – Toshiro

3

Con l'opzione 2 nella risposta di @ agstudy ora deprecata, la definizione dei dati con una funzione può essere utile.

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

Questo approccio risulta utile se si desidera riutilizzare un set di dati nello stesso appezzamento, per esempio non si desidera specificare una nuova colonna nel data.frame, o se si vuole tracciare esplicitamente un set di dati in uno strato sopra l'altro filtro .:

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

Provare a sottoinsieme solo le righe di P1 e P3

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

Quindi è possibile stampare Valore1. vs Valore2.