2016-07-25 12 views
0

Ich versuche, zwei Diagramme zusammen zu zeichnen, wobei eins ein Hauptdiagramm und das andere ein Unterdiagramm ist, das ich im Legendenbereich des Haupthandlung.Verwenden von arrangeGrob zum Hinzufügen eines Unterdiagramms als Legende

Dieser Code erzeugt dieses Grundstück:

gLegend <- function(a.gplot){ 
    tmp <- ggplot_gtable(ggplot_build(a.gplot)) 
    leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
    legend <- tmp$grobs[[leg]] 
    return(legend) 
} 

set.seed(1) 
main.df <- data.frame(group=rep(LETTERS[1:4],3), 
        y=rnorm(12),x=c(rep(1,4),rep(2,4),rep(3,4)),col=rep(c("gray","blue","red","magenta"),3)) 
main.df$group <- factor(main.df$group,levels=LETTERS[1:4]) 
sub.df <- data.frame(group=c("B","C","D"),x=1:3,effect=runif(3,0,1),col=c("blue","red","magenta")) 
sub.df$group <- factor(sub.df$group,levels=LETTERS[2:4]) 

main.plot <- ggplot(main.df,aes(x=x,y=y,color=factor(group)))+geom_point(size=3)+facet_wrap(~group,ncol=4)+scale_fill_manual(values=c("gray","blue","red","magenta"),labels=c("A","B","C","D"),name="group")+scale_colour_manual(values=c("gray","blue","red","magenta"),labels=c("A","B","C","D"),name="group")+scale_x_continuous(breaks=unique(main.df$x)) 
sub.plot <- ggplot(sub.df,aes(x=x,y=effect,color=factor(group)))+geom_point(size=2)+scale_fill_manual(values=c("blue","red","magenta"),labels=c("B","C","D"),name="group",guide=FALSE)+scale_colour_manual(values=c("blue","red","magenta"),labels=c("B","C","D"),name="group",guide=FALSE)+labs(x="group",y="effect")+ggtitle("effect summary")+scale_x_continuous(breaks=unique(sub.df$x),labels=c("B","C","D")) 

sub.plot.grob <- ggplotGrob(sub.plot) 
combined.plot <- arrangeGrob(main.plot+theme(legend.position="none"),widths=c(0.75,0.25),arrangeGrob(20,sub.plot.grob),ncol=2) 

enter image description here

Was würde ich ist von der Legende von der Haupthandlung loszuwerden zu tun.

Wenn ich guide=FALSE zu scale_fill_manualscale_colour_manualgLegend hinzufügen führt den Fehler:

Error in tmp$grobs[[leg]] : 
    attempt to select less than one element in get1index 

Offensichtlich, weil es kann nicht fein "guide-box"

Jede Idee, wie dieses Problem zu lösen?

Antwort

0

Hier wird Lösung grid Paket, wenn Sie ein Leerzeichen wollen, wo die aktuelle Legende:

enter image description here

library(grid) 

set.seed(1) 
main.df <- data.frame(group=rep(LETTERS[1:4],3), 
        y = rnorm(12), 
        x = c(rep(1,4), rep(2,4), rep(3,4)), 
        col = rep(c("gray", "blue", "red", "magenta"), 3)) 
main.df$group <- factor(main.df$group,levels=LETTERS[1:4]) 

sub.df <- data.frame(group=c("B", "C", "D"), 
       x = 1:3, 
       effect = runif(3, 0, 1), 
       col = c("blue", "red", "magenta")) 
sub.df$group <- factor(sub.df$group, levels=LETTERS[2:4]) 

main.plot <- ggplot(main.df, aes(x = x,y = y, color = factor(group))) + 
geom_point(size = 3) + facet_wrap(~group, ncol = 4) + 
scale_fill_manual(values = c("gray", "blue", "red", "magenta"), 
labels = c("A", "B", "C", "D"),name = "group") + 
scale_colour_manual(values = c("gray", "blue", "red", "magenta"), 
labels = c("A", "B", "C", "D"), name = "group") + 
scale_x_continuous(breaks = unique(main.df$x)) + guides(color = F) 

sub.plot <- ggplot(sub.df, aes(x = x, y = effect, color = factor(group))) + 
geom_point(size = 2) + 
scale_fill_manual(values = c("blue", "red", "magenta"), 
labels = c("B", "C", "D"), name= "group" ,guide = FALSE) + 
scale_colour_manual(values = c("blue", "red", "magenta"), 
labels = c("B", "C", "D"), name = "group", guide=FALSE) + 
labs(x = "group", y = "effect") + 
ggtitle("effect summary") + 
scale_x_continuous(breaks = unique(sub.df$x), labels = c("B", "C", "D")) 


blank = grid.rect(gp = gpar(col = "white")) 

sub.plot.grob <- arrangeGrob(blank, sub.plot, ncol = 1) 

combined.plot <- arrangeGrob(main.plot, sub.plot.grob, ncol=2, widths=c(0.75,0.25)) 

grid.arrange(combined.plot) 
1

enter image description here Hier ist eine alternative Lösung mit cowplot

library(ggplot2) 
library(cowplot) 
theme_set(theme_bw()) #cowplot automatically sets theme_classic 

set.seed(1) 
main.df <- data.frame(group=rep(LETTERS[1:4],3), 
         y=rnorm(12),x=c(rep(1,4),rep(2,4),rep(3,4)),col=rep(c("gray","blue","red","magenta"),3)) 
main.df$group <- factor(main.df$group,levels=LETTERS[1:4]) 
sub.df <-  data.frame(group=c("B","C","D"),x=1:3,effect=runif(3,0,1),col=c("blue","red","magenta")) 
sub.df$group <- factor(sub.df$group,levels=LETTERS[2:4]) 

sub.plot <- ggplot(sub.df,aes(x=x,y=effect,color=factor(group)))+ 
    geom_point(size=2)+ 
    scale_fill_manual(values=c("blue","red","magenta"),labels=c("B","C","D"),name="group",guide=FALSE)+ 
    scale_colour_manual(values=c("blue","red","magenta"),labels=c("B","C","D"),name="group",guide=FALSE)+ 
    labs(x="group",y="effect")+ 
    ggtitle("effect summary")+ 
    scale_x_continuous(breaks=unique(sub.df$x),labels=c("B","C","D")) 


main.plot <- ggplot(main.df,aes(x=x,y=y,color=factor(group)))+ 
    geom_point(size=3)+facet_wrap(~group,ncol=4)+ 
    scale_fill_manual(values=c("gray","blue","red","magenta"),labels=c("A","B","C","D"),name="group")+ 
    scale_colour_manual(values=c("gray","blue","red","magenta"),labels=c("A","B","C","D"),name="group")+ 
    scale_x_continuous(breaks=unique(main.df$x)) + 
    theme(legend.position = "none") 

ggdraw() + 
    draw_plot(main.plot, x = 0, y = 0, width = 0.75, height = 1) + 
    draw_plot(sub.plot, 0.75, 0, .25, .5) 
1

versuchen Sie dies,

grid.arrange(ggplot(), ggplot(), 
      layout_matrix=matrix(c(1,1,NA,2), 2), widths=c(1.5,1)) 

enter image description here