2016-03-24 9 views
19

Ich habe drei Plots und ich versuche, sie mit grid.arrange zu kombinieren. Die letzte Parzelle sollte eine geringere Höhe als die ersten beiden Parzellen haben und alle Parzellen sollten die gleiche Breite haben.Geben Sie Breiten und Höhen von Plots mit grid.arrange

Ein Arbeitsbeispiel:

p1 <- qplot(mpg, wt, data=mtcars) 
p2 <- p1 
p3 <- p1 + theme(axis.text.y=element_blank(), axis.title.y=element_blank()) 

grid.arrange(arrangeGrob(p1,p2, ncol=1, nrow=2), 
     arrangeGrob(p3, ncol=1, nrow=1), heights=c(4,1)) 

enter image description here

Hier ist die letzte Handlung hat eine größere Breite als die ersten beiden. In meinen realen Daten, auch wenn ich den Text und den Titel auf der y-Achse behalte, habe ich immer noch eine andere Breite für den dritten Plot.

Ich habe versucht, "Breiten" hinzuzufügen:

grid.arrange(arrangeGrob(p1,p2, ncol=1, nrow=2), 
     arrangeGrob(p3, ncol=1, nrow=1), heights=c(4,1), widths=c(2,1)) 

Aber es stellt sich in eine zweispaltige Grundstück ...

enter image description here

Ich habe auch versucht, einen anderen Code:

p1 <- ggplotGrob(p1) 
p2 <- ggplotGrob(p2) 
p3 <- ggplotGrob(p3) 
# 
stripT <- subset(p2$layout, grepl("spacer", p2$layout$name)) 
p3 <- p3[-stripT$t, ] 

grid.draw(rbind(p1, p2, p3, size = "first")) 

Ich habe die gleichen Breiten, aber jetzt weiß ich nicht, wie man die Höhen ändert ...

enter image description here

Nun, kann mir jemand helfen für eine endgültige Handlung sowohl die Höhe und Breite Aspekte zu kombinieren?

Antwort

20

Versuchen plot_grid vom cowplot Paket:

library(ggplot2) 
library(gridExtra) 
library(cowplot) 
p1 <- qplot(mpg, wt, data=mtcars) 
p2 <- p1 
p3 <- p1 + theme(axis.text.y=element_blank(), axis.title.y=element_blank()) 
plot_grid(p1, p2, p3, align = "v", nrow = 3, rel_heights = c(1/4, 1/4, 1/2)) 

enter image description here

+0

Genau das, was ich suchte, vielen Dank! – Chika

5

mit gtable Sie manuell die Höhen der Paneele setzen müssen,

g1 <- ggplotGrob(p1) 
g2 <- ggplotGrob(p2) 
g3 <- ggplotGrob(p3) 

library(gridExtra) 
g <- rbind(g1, g2, g3) 

set_panel_heights <- function(g, heights){ 
    g$heights <- grid:::unit.list(g$heights) # hack until R 3.3 comes out 
    id_panels <- unique(g$layout[g$layout$name=="panel", "t"]) 
    g$heights[id_panels] <- heights 
    g 
} 

g <- set_panel_heights(g, lapply(1:3, grid::unit, "null")) 
grid::grid.draw(g) 

enter image description here

Obwohl ein Bit ausführlich, ist dieser Ansatz allgemeiner als Angabe relative Höhen: Sie alle Arten von Rastereinheiten mischen,

grid::grid.newpage() 
g <- do.call(rbind, replicate(3, ggplotGrob(ggplot()), simplify = FALSE)) 
g <- set_panel_heights(g, list(unit(1,"in"), unit(1,"line"), unit(1,"null"))) 
grid::grid.draw(g) 

enter image description here

Verwandte Themen