2013-05-03 20 views
17

我試圖使用grid.arrange安排多個圖。 它通過這本書做這項工作,並調用時:使用grid保留圖的比例.arrange

p1 <- ggplot(subset(mtcars, cyl = 4), aes(wt, mpg, colour = cyl)) + geom_point() 
p2 <- ggplot(subset(mtcars, cyl = 8), aes(wt, mpg, colour = cyl)) + geom_point() 

grid.arrange(p1, p2, ncol = 2) 

我得到兩個漂亮的曲線,對稱的大小:

enter image description here

我的圖表是指不同的參數,但他們共享同組顏色編碼。所以我想刪除除了一個之外的所有圖例,併爲它找到一個不錯的地方。

然而,當我嘗試:

p3 <- ggplot(subset(mtcars, cyl = 8), aes(wt, mpg, colour = cyl)) + geom_point() + guides(colour=FALSE) 

grid.arrange(p3, p2, ncol = 2) 

沒有傳說中的情節得到(正確地)更大:

enter image description here

我想保持一定的尺寸(如x的長度軸)保持相同的圖形。

我知道我可以在這裏使用小面,但我還需要說(我認爲)各個圖形組合將很難使用方面來實現..

是否有可能與grid.arrange做?任何其他解決方案可以幫助這裏?

+0

你可以做到這一點沒有'通過磨製grid.arrange'。但是'mtcars'中沒有'class'列來表明這一點。 – Arun 2013-05-03 21:48:55

+0

@阿倫蘇里 - 我的錯。切換到氣缸的例子。正如我所提到的,我意識到刻面的魔力,但是我不想使用它。 – radek 2013-05-03 21:55:45

回答

11

幾乎沒有一樣淡雅的@Josh的解決方案,但你可以用grid.arrange它允許您保留或做指定圖的縱橫比,但您需要爲圖例製作tableGrob。我回答一個問題呈三角here這是我得到了方便的代碼從GGPLOT2傳奇製作tableGrob:

## Make a tableGrob of your legend 
tmp <- ggplot_gtable(ggplot_build(p2)) 
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") 
legend <- tmp$grobs[[leg]] 

# Plot objects using widths and height and respect to fix aspect ratios 
# We make a grid layout with 3 columns, one each for the plots and one for the legend 
grid.newpage() 
pushViewport(viewport(layout = grid.layout(1 , 3 , widths = unit(c(0.4 , 0.4 , 0.2) , "npc") ,heights = unit(c(0.45 , 0.45 , 0.45) , "npc") , respect = matrix(rep(1,3),1)))) 
print(p1 + theme(legend.position="none") , vp = viewport(layout.pos.row = 1 , layout.pos.col = 1)) 
print(p2 + theme(legend.position="none") , vp = viewport(layout.pos.row = 1, layout.pos.col = 2)) 
upViewport(0) 
vp3 <- viewport(width = unit(0.2,"npc") , x = 0.9 , y = 0.5) 
pushViewport(vp3) 
grid.draw(legend) 
popViewport() 

enter image description here

+0

非常感謝。儘管解決方案更長,但它完成了這項工作兩個(新手)問題:1)寬度的單位和爲1?什麼是「尊重」參數指定? – radek 2013-05-04 13:04:10

+2

我發現respsect參數有點令人困惑,但本質上我認爲它是每個視口寬高比的矩陣,所以我們有'1,1,1',因爲我們有1行和3列,我們想要1:1長寬比在每個。這可能不是*完全*它是如何工作的,但它可以幫助我!寬度單位不等於1.您可以將它們擠入小於繪圖區域的寬度。 「npc」從0到1,其中0爲繪圖區域的左邊緣或底部,1爲右邊緣或頂部,0.5爲中心。按比例縮放。] – 2013-05-04 13:10:48

+0

超級。現在都清楚了。謝謝。 – radek 2013-05-04 16:43:14

23

試試這個,它採用cbind.gtable

grid.draw(cbind(ggplotGrob(p3), ggplotGrob(p2), size="last")) 

enter image description here

+2

+1我有大約20行代碼,我正要粘貼來完成同樣的事情,有點手動擺弄。我*希望*在此之前我已經瞭解了'cbind.gtable'。謝謝。 – 2013-05-03 22:00:08

+0

@Josh謝謝。確實很棒但是(和西蒙一樣,我需要詢問有關寬高比 - 是否可以保留? – radek 2013-05-03 22:10:02

+1

@ SimonO101 - 好問題,看起來並不像它提供的那樣,如果你們其中一個想要這樣做,我可能會建議看着'getAnywhere(「cbind_gtable」)',這是單元看起來被設置的位置,以及你可能要修改代碼的地方。 – 2013-05-03 22:17:49

相關問題