在ggplot2中创建任意窗格

JD *_*ong 25 r ggplot2

在基本图形中,我可以通过执行以下操作创建4个面板图形窗格:

par(mfrow=c(2,2))
for (i in 1:4){
  plot(density(rnorm(100)))
}
Run Code Online (Sandbox Code Playgroud)

结果

在此输入图像描述

我想用ggplot2做同样的事情,但我无法弄清楚如何做到这一点.我不能使用facet,因为我的真实数据,与这个简单的例子不同,是非常不同的结构,我想要两个图表是点图表,两个图表是直方图.如何在ggplot2中创建面板或窗格?

Ben*_*ker 31

继乔希奥布莱恩的例子:我很惊讶没有人提到grid.arrangegridExtra包尚未:

library(gridExtra)
grid.arrange(q1,q2,q3,q4,q5,q6,nrow=3)
Run Code Online (Sandbox Code Playgroud)

这似乎在这里提到:使用ggplot2在一个画布中的多个图形

对我来说,它比记住所有视口内容要容易得多.

  • `grid.arrange`附带了对`multiplot`的一些增强,例如i)处理网格/网格对象; ii)与`ggsave`兼容; iii)布局参数; iv)默认nrow/ncol; v)`arrangeGrob`版本以避免立即绘图; vi)任何一方头衔的占位符; vii)as.table参数,用于反转绘图顺序. (3认同)

Jos*_*ien 19

编辑: {Ben Bolker指出一个更好的选择 - grid.arrangegridExtra包.ggplot2但是,如果您是用户,那么R Cookbook网站仍然值得点击.}

在这个 R Cookbook的页面上有一个很好的multiplot功能代码(绝对值得一游),这对于这类事情很有用.直接从该网站引用:

multiplot <- function(..., plotlist=NULL, cols) {
    require(grid)

    # Make a list from the ... arguments and plotlist
    plots <- c(list(...), plotlist)

    numPlots = length(plots)

    # Make the panel
    plotCols = cols                       # Number of columns of plots
    plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols

    # Set up the page
    grid.newpage()
    pushViewport(viewport(layout = grid.layout(plotRows, plotCols)))
    vplayout <- function(x, y)
        viewport(layout.pos.row = x, layout.pos.col = y)

    # Make each plot, in the correct location
    for (i in 1:numPlots) {
        curRow = ceiling(i/plotCols)
        curCol = (i-1) %% plotCols + 1
        print(plots[[i]], vp = vplayout(curRow, curCol ))
    }

}
Run Code Online (Sandbox Code Playgroud)

尝试使用3×2布局的6个地块(JD Long的四个地块和两个奖励的地块!):

set.seed(2)
q1 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density()
q2 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density()
q3 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density()
q4 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density()
q5 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density()
q6 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density()

multiplot(q1, q2, q3, q4, q5, q6, cols=2)
Run Code Online (Sandbox Code Playgroud)

给出这个数字:

在此输入图像描述

如果功能不太适合您的需求,至少它为您提供了一个很好的起点!


JD *_*ong 12

感谢Andrie的评论和Harlan对我之前的问题(!)的回答,我掀起了这个解决方案,它完成了我的目标:

set.seed(2)
q1 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density()
q2 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density()
q3 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density()
q4 <- ggplot(data.frame(x=rnorm(50)), aes(x)) + geom_density()

grid.newpage()
pushViewport(viewport(layout=grid.layout(2,2)))
vplayout <- function(x,y) viewport(layout.pos.row=x,layout.pos.col=y)
print(q1,vp=vplayout(1,1))
print(q2,vp=vplayout(1,2))
print(q3,vp=vplayout(2,1))
print(q4,vp=vplayout(2,2))
Run Code Online (Sandbox Code Playgroud)

产量:

在此输入图像描述

  • 增加的奖励:您的地块似乎已获得模式。:) (2认同)

Tun*_*ung 8

截至2018年7月,有几个软件包可以很好地创建多面板图。请参阅以下示例

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))
Run Code Online (Sandbox Code Playgroud)

鸡蛋包装

library(grid)
library(egg)

ggarrange(q1, q2, q3, q4, 
          ncol = 2,
          top = "Plot title",
          bottom = textGrob(
            "This footnote is right-justified",
            gp = gpar(fontface = 3, fontsize = 10),
            hjust = 1, x = 1)
          )
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Run Code Online (Sandbox Code Playgroud)

牛棚包装

library(cowplot)

plot_grid(q1, q2, q3, q4, 
          ncol = 2,
          labels = "AUTO")
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Run Code Online (Sandbox Code Playgroud)

拼布包

library(patchwork)

q1 + q2 + q3 + q4 + 
  plot_layout(ncol = 2) +
  plot_annotation(title = "Plot title",
                  subtitle = "Plot subtitle",
                  tag_levels = 'A',
                  tag_suffix = ')')
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Run Code Online (Sandbox Code Playgroud)

# complex layout 1
q1 + {
  q2 + plot_spacer() + {
    q3 + 
      q4 + 
      plot_layout(ncol = 1)
  }
} +
  plot_layout(ncol = 1)
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Run Code Online (Sandbox Code Playgroud)

# complex layout 2
(q1 | q2 | q3) /
  q4
#> `geom_smooth()` using method = 'loess' and formula 'y ~ x'
Run Code Online (Sandbox Code Playgroud)

# bonus: working with grob objects
p1 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
table1 <- tableGrob(mtcars[1:6, 1:4])
patchwork::wrap_plots(list(p1, table1), nrow = 1) 
Run Code Online (Sandbox Code Playgroud)

多功能包装

library(magrittr)
library(multipanelfigure)

figure1 <- multi_panel_figure(columns = 2, rows = 2, panel_label_type = "none")
# show the layout
figure1
Run Code Online (Sandbox Code Playgroud)

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

# complex layout
figure2 <- multi_panel_figure(columns = 3, rows = 3, panel_label_type = "upper-roman")

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

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