2014-06-20 18 views
15

DOMANDAI pericoli di allineamento appezzamenti in ggplot

Come si coniuga appezzamenti separati (ggplot2), con diversi asse y e diverse altezze trama, mantenendo tuttavia l'allineamento?

DETTAGLIO

Quando si combinano con piazzole grid.arrange (method1), con diverse unità dell'asse y, non allineati. Un modo per aggirare questo è usare gtable (metodo2), ma non posso regolare l'altezza relativa dei grafici.

ESEMPIO

require(ggplot2) 

#Make two plots, with different y axis 
    x = c(1, 5) 
    y= c(.1, .4) 
    data1<-data.frame(x,y) 
    top<- 
    ggplot(data1, aes(x=x, y=y))+ 
    geom_line() 

    x = c(1, 5) 
    y= c(100000, 400000) 
    data2<-data.frame(x,y) 
    bottom<- 
    ggplot(data2, aes(x=x, y=y))+ 
    geom_line() 


# Method 1 - Grid Extra 
    require(gridExtra) 
    grid.arrange(top, bottom, heights=c(.6,.3)) 

Metodo 1 risultati in questa trama, che non è allineata a causa delle diverse etichette dell'asse lunghezza y:

enter image description here

#Method 2 - gtable 
    require(gtable) 
    #Extract Grobs 
    g1<-ggplotGrob(top) 
    g2<-ggplotGrob(bottom) 
    #Bind the tables 
    g<-gtable:::rbind_gtable(g1, g2, "first") 
    #Remove a row between the plots 
    g <- gtable_add_rows(g, unit(-1,"cm"), pos=nrow(g1)) 
    #draw 
    grid.newpage() 
    grid.draw(g) 

Metodo 2 risultati in allineati trame, ma non posso regolare l'altezza di ogni trama. enter image description here

GRAZIE!

+1

[** Questo potrebbe aiutare **] (http://stackoverflow.com/a/16368413/1478381) –

risposta

17

Nella tua gtable g, è possibile impostare l'altezza del pannello relativi,

require(gtable) 
g1<-ggplotGrob(top) 
g2<-ggplotGrob(bottom) 
g<-gtable:::rbind_gtable(g1, g2, "first") 
panels <- g$layout$t[grep("panel", g$layout$name)] 
g$heights[panels] <- unit(c(1,2), "null") 

grid.newpage() 
grid.draw(g) 
+0

Opere in modo impeccabile e risultati molto migliori rispetto al metodo grid.arrange. Grazie. – wab

+0

Grazie per l'ottima risposta! Ma forse qualcosa è cambiato negli aggiornamenti della griglia, ma ora (versione 3.3.0) per far funzionare la seconda riga deve essere: 'g $ heights [panels] <- unit (c (2,1)," null ")' –

+0

@RNoob correct, le cose sono cambiate a quel livello sia in griglia che in ggplot2 – baptiste