如何获得ggplots的“不平衡”网格?


94

通过使用以下命令,grid.arrange我可以ggplot在网格中排列多个图形以实现多面板图形:

library(ggplot2)
library(grid)
library(gridExtra)

生成一些ggplot2图,然后

plot5 <- grid.arrange(plot4, plot1, heights=c(3/4, 1/4), ncol=1, nrow=2)

如何获得“不平衡”的2列布局,整个第一个列中有一个图,第二个列中有三个图?我通过尝试用grid.arrange一个网格(例如plot5上面的图)相对于另一个图绘制一个“网格”方法,但获得了:

排列错误(...,as.table = as.table,clip = clip,main = main,:输入必须是grobs!

更新:

谢谢你的建议。我将调查viewportsgrid。同时,感谢@​​ DWin,layOut'wq'包中的函数对于我Sweave文档中的编译图非常有效: 在此处输入图片说明

更新2:

arrangeGrob命令(由@baptiste建议)也可以很好地工作,并且看起来非常直观-至少很容易更改两列的宽度。它还具有不需要`wq'软件包的好处。

例如,这是我的Sweave文件中的代码:

<<label=fig5plot, echo=F, results=hide>>=
plot5<-grid.arrange(plot4, arrangeGrob(plot1, plot2, plot3, ncol=1), 
                    ncol=2, widths=c(1,1.2))
@
\begin{figure}[]
    \begin{center}
<<label=fig5,fig=TRUE,echo=T, width=10,height=12>>=
<<fig5plot>>
@
\end{center}
\caption{Combined plots using the `arrangeGrob' command.}
\label{fig:five}
\end{figure}

产生以下输出: 在此处输入图片说明

顺便说一句,有人告诉我为什么显示“> NA”吗?


您可能必须自己设置视口– grid.arrange可能不够灵活(“ [r]网格视口”的搜索stackoverflow)
Ben Bolker

2
@BenBolker使用指示您取得了丰硕的成果grid。另请参见Hadley的ggplot2书第8.4.2节。
Ari B. Friedman

1
@BenBolker grid.arrange可以与它的同伴一起用于嵌套视口arrangeGrob(本质上返回a gTree),如下面的示例所示。
baptiste

1
plot5不需要最终分配给,因为不会grid.arrange返回任何内容(NULL)。如果要保存生成的文件,请arrangeGrob再次使用(并grid.draw显示它)。
baptiste

Answers:


73

grid.arrange直接在设备上绘制;如果您想将其与所需的其他网格对象组合arrangeGrob,如

 p = rectGrob()
 grid.arrange(p, arrangeGrob(p,p,p, heights=c(3/4, 1/4, 1/4), ncol=1),
              ncol=2)

编辑(07/2015):v> 2.0.0时,您可以使用layout_matrix参数,

 grid.arrange(p,p,p,p, layout_matrix = cbind(c(1,1,1), c(2,3,4)))

6
您能解释一下cbind(c(1,1,1), c(2,3,4))矩阵如何描述图形的排列吗?
罗恩·杰曼

5
@RonGejman,如果在屏幕上打印3x2矩阵,这很容易:第一列全为1,这是第一张图所在的位置,跨越三行;第二列包含地块2、3、4,每个地块占据一行。
baptiste

17

我试着用网格弄清楚它,并以为我失败了,但是最终失败了(尽管现在看下面我引用的函数中的代码,我可以看到我真的很接近... :-)

'wq'软件包具有一个layOut可以为您完成的功能:

p1 <- qplot(mpg, wt, data=mtcars)
layOut(list(p1, 1:3, 1),   # takes three rows and the first column
        list(p1, 1, 2),    # next three are on separate rows
         list(p1, 2,2), 
          list(p1, 3,2))

在此处输入图片说明


哇,这是个有用的功能!我认为复制+粘贴可能会使您失败。你意味着g1g2等,以全部p1
joran 2011年

3
@joran:我做到了。我不记得“编程的三种优点”中的哪一种是懒惰,但是我知道那是存在的。
IRTFM

谢谢!做得非常好。往上看。
user441706 2011年

2

另一个选择是patchworkThomas Lin Pedersen 的包装。

# install.packages("devtools")
# devtools::install_github("thomasp85/patchwork")
library(patchwork)

生成一些图。

p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp)) + facet_grid(rows = vars(gear))
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
p3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
p4 <- ggplot(mtcars) + geom_bar(aes(carb))

现在安排地块。

p1 + (p2 / p3 / p4)

在此处输入图片说明


1

还有值得一提的multipanelfigure程序包。另请参阅此答案

library(ggplot2)
theme_set(theme_bw())

q1 <- ggplot(mtcars) + geom_point(aes(mpg, disp))
q2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
q3 <- ggplot(mtcars) + geom_smooth(aes(disp, qsec))
q4 <- ggplot(mtcars) + geom_bar(aes(carb))

library(magrittr)
library(multipanelfigure)

figure1 <- multi_panel_figure(columns = 2, rows = 3, panel_label_type = "upper-roman")

figure1 %<>%
  fill_panel(q1, column = 1, row = 1:3) %<>%
  fill_panel(q2, column = 2, row = 1) %<>%
  fill_panel(q3, column = 2, row = 2) %<>%
  fill_panel(q4, column = 2, row = 3)
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
figure1

reprex软件包(v0.2.0.9000)创建于2018-07-16 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.