2014-06-20 21 views
15

PYTANIENiebezpieczny wyrównywanie działek w ggplot

Jak połączyć oddzielne działki (ggplot2), z różnymi osi y i różnych wysokościach działce, jeszcze zachować wyrównanie?

DETAL

Przy łączeniu działek z grid.arrange (Metoda 1), z różnych jednostek na osi y, ale nie pokrywają się. Jednym ze sposobów jest użycie gtable (metoda2), ale nie mogę zmienić względnej wysokości wykresów.

Przykład

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

metody 1 wyniki na tym wykresie, który jest wyrównany z powodu różnych etykiet podłużnej osi 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) 

metoda 2 Wyniki współosiowa działki, ale nie mogę wyregulować wysokości każdej działki. enter image description here

DZIĘKI!

+1

[** To może pomóc **] (http://stackoverflow.com/a/16368413/1478381) –

Odpowiedz

17

W swojej gtable g można ustawić względne wysokości panelu,

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

Works bezbłędnie i znacznie lepsze wyniki niż metoda grid.arrange. Dzięki. – wab

+0

Dzięki za wspaniałą odpowiedź! Ale być może coś zmieniło się w aktualizacjach siatki, ale teraz (wersja 3.3.0), aby ta działała, druga linia musi być: 'g $ wysokość [panele] <- jednostka (c (2,1)," null ")' –

+0

@RNo prawidłowe, rzeczy zmieniły się na tym poziomie zarówno w siatce, jak i ggplot2 – baptiste