2016-02-22 8 views
5

Sto tentando di stampare grafici a linee per e facet_wrap per ogni set di dati. Quello che mi piacerebbe avere è in grigio chiaro, trasparente o qualcosa, tutti i set di dati sullo sfondo.tracciamento di tutti i dati all'interno di ogni facet utilizzando facet_wrap e ggplot2

df <- data.frame(id=rep(letters[1:5], each=10), 
       x=seq(10), 
       y=runif(50)) 

ggplot(df, aes(x,y, group=id)) + 
    geom_line() + 
    facet_wrap(~ id) 

enter image description here

Questo grafico è fino a che punto ho, ma mi piacerebbe avere tutti gli altri mancanti 4 linee in ogni grafico così ... in ogni modo cerco di usare facet_wrap, ho ottieni solo i dati di una singola riga.

Quello che mi aspetterei è qualcosa di simile per ogni sfaccettatura.

ggplot(df, aes(x,y, group=id)) + 
    geom_line() + 
    geom_line(data=df[1:10,], aes(x,y, group=id), size=5) 

enter image description here

risposta

9

Ecco un altro approccio:

Prima aggiungere una nuova colonna identica a id:

df$id2 <- df$id 

quindi aggiungere un altro geom_line in base alla df, senza la colonna id originale:

ggplot(df, aes(x,y, group=id)) + 
    geom_line(data=df[,2:4], aes(x=x, y=y, group=id2), colour="grey") + 
    geom_line() + 
    facet_wrap(~ id) 

enter image description here

+0

Questo è fantastico! Non ho davvero pensato di aggiungere nuovi dati a una geom in questo modo, e ho provato troppa "linea con tutte le informazioni per tutte le osservazioni". – Heroka

+0

Mi piace anche questa soluzione più di @Heroka. Devo ancora pensare un minuto perché funzioni bene, ma penso che questo risolva facilmente il mio problema ... – drmariod

+0

Grazie :) Anche se sono sicuro che ci sono molti modi ugualmente creativi che funzionano qui. – beetroot

3

Ecco un approccio. Potrebbe non essere adatto per dataset più grandi, poiché replichiamo i dati number_of_facets volte.

In primo luogo, facciamo un po 'di scambio di dati per creare questo dataframe desiderato. df $ obs_id <-1: nrow (df) ID #unique per ogni osservazione

#new data with unique ID's and 'true' facets 
df2 <- expand.grid(true_facet=unique(df$id), obs_id=1:nrow(df)) 

#merge them 
dat <- merge(df,df2,by="obs_id",all=T) 

Poi, creiamo una bandiera che definisce il 'vero' variabile sfaccettato, e di discernere sfondo dal primo piano.

dat$col_flag <- dat$true_facet == dat$id 

Ora, la stampa è facile. Ho usato geom_line due volte anziché le scale, poiché era più facile che provare a correggere l'ordinamento (porterei a tracciare il nero sotto il grigio).

p1 <- ggplot(dat, aes(x=x,y=y, group=id))+ 
    geom_line(color="grey")+ 
    geom_line(dat=dat[dat$col_flag,],size=2,color="black")+ 
    facet_wrap(~true_facet) 

enter image description here