2016-05-04 14 views
4

I folgenden Datenrahmen habe:ggplot: Erzeugen Facette Gitterstück mit mehrere Serie

Quarter  x  y   p   q 
1 2001 8.714392 8.714621 3.3648435 3.3140090 
2 2002 8.671171 8.671064 0.9282508 0.9034387 
3 2003 8.688478 8.697413 6.2295996 8.4379698 
4 2004 8.685339 8.686349 3.7520135 3.5278024 

Ihr Ziel ist es, ein Facette Stück in der X und Y-Spalte in einer Parzelle in der Facette und p, q, zusammen zu erzeugen, in eine andere Handlung anstelle von 4 Facetten.

Wenn ich folgendes:

x.df.melt <- melt(x.df[,c('Quarter','x','y','p','q')],id.vars=1) 
ggplot(x.df.melt, aes(Quarter, value, col=variable, group=1)) + geom_line()+ 
    facet_grid(variable~., scale='free_y') + 
    scale_color_discrete(breaks=c('x','y','p','q')) 

ich die alle vier Serien in 4 verschiedenen Facetten, aber wie kann ich kombinieren x, y zu sein, während p, q in einem anderen zusammen zu sein. Bevorzugt keine Legenden.

enter image description here

Antwort

2

Eine Idee, eine neue Gruppierung Variable zu erstellen wäre:

x.df.melt$var <- ifelse(x.df.melt$variable == "x" | x.df.melt$variable == "y", "A", "B") 

Sie können es für Facettieren während variable für die Gruppierung mit:

ggplot(x.df.melt, aes(Quarter, value, col=variable, group=variable)) + geom_line()+ 
    facet_grid(var~., scale='free_y') + 
    scale_color_discrete(breaks=c('x','y','p','q'), guide = F) 

enter image description here

+0

Neue Variable wird zum geschmolzenen Datenrahmen hinzugefügt? –

+0

alles gute dank –

0

Ich denke Rote Bete ' Die obige Antwort ist eleganter, aber ich arbeitete an dem gleichen Problem und kam am selben Ort auf eine andere Weise an. Ich denke, es ist interessant, weil ich eine "Doppelschmelze" (yum!) Verwendet habe, um die x, y/p, q Paare auszurichten. Es zeigt auch tidyr::gather anstelle von Schmelze.

library(tidyr) 
x.df<- data.frame(Year=2001:2004, 
        x=runif(4,8,9),y=runif(4,8,9), 
        p=runif(4,3,9),q=runif(4,3,9)) 


x.df.melt<-gather(x.df,"item","item_val",-Year,-p,-q) %>% 
    group_by(item,Year) %>% 
    gather("comparison","comp_val",-Year,-item,-item_val) %>% 
    filter((item=="x" & comparison=="p")|(item=="y" & comparison=="q")) 

> x.df.melt 
# A tibble: 8 x 5 
# Groups: item, Year [8] 
    Year item item_val comparison comp_val 
    <int> <chr> <dbl>  <chr> <dbl> 
1 2001  x 8.400538   p 5.540549 
2 2002  x 8.169680   p 5.750010 
3 2003  x 8.065042   p 8.821890 
4 2004  x 8.311194   p 7.714197 
5 2001  y 8.449290   q 5.471225 
6 2002  y 8.266304   q 7.014389 
7 2003  y 8.146879   q 7.298253 
8 2004  y 8.960238   q 5.342702 

Siehe unten für die grafische Darstellung.

Eine Schwäche dieses Ansatzes (und Rote-Beete-Verwendung von ifelse) ist die filter Anweisung wird schnell unhandlich, wenn Sie viele Paare zu vergleichen haben. In meinem Anwendungsfall habe ich die Performance der Investmentfonds mit einer Reihe von Benchmark-Indizes verglichen. Jeder Fonds hat eine andere Benchmark. Ich löste dies mit einer Tabelle von Metadaten, die die Fonds-Ticker mit ihren jeweiligen Benchmarks paaren, und dann left/right_join verwenden. In diesem Fall:

#create meta data 
pair_data<-data.frame(item=c("x","y"),comparison=c("p","q")) 

#create comparison name for each item name 
x.df.melt2<-x.df %>% gather("item","item_val",-Year) %>% 
    left_join(pair_data) 

#join comparison data alongside item data 
x.df.melt2<-x.df.melt2 %>% 
    select(Year,item,item_val) %>% 
    rename(comparison=item,comp_val=item_val) %>% 
    right_join(x.df.melt2,by=c("Year","comparison")) %>% 
    na.omit() %>% 
    group_by(item,Year) 

ggplot(x.df.melt2,aes(Year,item_val,color="item"))+geom_line()+ 
    geom_line(aes(y=comp_val,color="comp"))+ 
    guides(col = guide_legend(title = NULL))+ 
    ylab("Value")+ 
    facet_grid(~item) 

enter image description here

Da es keine Notwendigkeit für eine neue Gruppierung variabel ist, dass wir die Namen der Referenz item s als Markierungen für das Facette Grundstück erhalten.