2016-02-22 6 views
5

Próbuję wykreślić wykresy liniowe dla i facet_wrap dla każdego zestawu danych. To, co chciałbym mieć to jasnoszare, przezroczyste lub coś w tym rodzaju, wszystkie zbiory danych w tle.wykreślając wszystkie dane w obrębie każdego aspektu za pomocą facet_wrap i 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

Ten wykres jest jak daleko mam, ale chciałbym mieć wszystkie inne brakujące 4 linie na każdym wykresie, jak również ... w żaden sposób próbuję użyć facet_wrap, ja pobieraj tylko dane z pojedynczej linii.

To, czego mógłbym oczekiwać, to coś takiego dla każdego aspektu.

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

Odpowiedz

9

Oto inne podejście:

Pierwszy dodać nową kolumnę identyczną ID:

df$id2 <- df$id 

Następnie dodać kolejny geom_line oparciu o df bez oryginalnego kolumnie ID:

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

To jest genialne! Naprawdę nie myślałem o dodawaniu nowych danych do geom w ten sposób i próbowałem zbyt wiele "jednej linii ze wszystkimi informacjami dla wszystkich obserwacji". – Heroka

+0

Te rozwiązania też lubię bardziej niż @Heroka. Nadal muszę się zastanawiać, dlaczego to działa ładnie, ale myślę, że to rozwiązuje mój problem z łatwością ... – drmariod

+0

Dziękuję :) Chociaż jestem pewien, że istnieje wiele równie twórczych sposobów, które działają tutaj. – beetroot

3

Oto podejście. Może nie być odpowiedni dla większych zestawów danych, ponieważ replikujemy dane.

Najpierw wykonujemy kilka operacji związanych z danymi, aby utworzyć tę pożądaną ramkę danych. df $ obs_id < - 1: nrow (DF) #unique ID dla każdej obserwacji

#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) 

Następnie tworzymy flagę określającą 'true' zmienną obliczach i dostrzec tło z pierwszym planie.

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

Teraz spisek jest łatwy. Użyłem geom_line dwa razy zamiast skal, ponieważ było to łatwiejsze niż próba naprawienia kolejności (doprowadziłoby to do wykreślenia czerni poniżej szarości).

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