【问题标题】:How can I obtain an 'unbalanced' grid of ggplots?如何获得 ggplots 的“不平衡”网格?
【发布时间】:2011-12-28 01:44:29
【问题描述】:

使用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)与另一个图绘制出来来玩弄“网格网格”方法,但获得了:

arrangeGrob(..., as.table = as.table, clip = clip, main = main, 中的错误: 输入必须是 grobs!

更新:

感谢您的建议。我会调查viewportsgrid。同时,感谢@​​DWin,'wq' 包中的layOut 函数对我的Sweave 文档中的编译图非常有效:

更新 2:

arrangeGrobcommand(由@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 可能不够灵活(在 stackoverflow 中搜索“[r] grid viewport”)
  • @BenBolker 使用grid 为您指明了一个富有成效的方向。另请参阅 Hadley 的 ggplot2 书,第 8.4.2 节。
  • @BenBolker grid.arrange 可以与嵌套视口一起使用,使用它的同伴arrangeGrob(本质上返回一个gTree),如下面的示例所示。
  • 您对plot5 的最终分配不是必需的,因为grid.arrange 不返回任何内容(NULL)。如果您想保存生成的 grob,请再次使用 arrangeGrob(并使用 grid.draw 来显示它)。

标签: r ggplot2 r-grid


【解决方案1】:

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

【讨论】:

  • 您能解释一下cbind(c(1,1,1), c(2,3,4)) 矩阵是如何描述图形排列的吗?
  • @RonGejman 如果您在屏幕上打印 3x2 矩阵,这很容易:第一列全为 1,这就是第一个图所在的位置,跨越三行;第二列包含图 2、3、4,每一个占一行。
【解决方案2】:

我尝试使用网格来解决它,并认为我已经失败了,但最终失败了(尽管现在查看我在下面引用的函数中的代码,我可以看到我真的很接近...... :-)

'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:我做到了。我不记得“编程的三大美德”中哪一个是懒惰,但我知道它在某个地方。
  • 谢谢!工作得很好。见上文。
【解决方案3】:

另一种选择是 Thomas Lin Pedersen 的 patchwork 软件包。

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

【讨论】:

    【解决方案4】:

    还有multipanelfigure package值得一提。另请参阅answer

    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 package (v0.2.0.9000) 于 2018 年 7 月 16 日创建。

    【讨论】:

      猜你喜欢
      • 2022-08-20
      • 2019-04-22
      • 1970-01-01
      • 2023-04-04
      • 2017-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多