带有marrangeGrob的每页绘图奇数

带有marrangeGrob的每页绘图奇数,r,gridextra,R,Gridextra,我有一个绘图列表,正在使用marrangeGrob每页编写多个绘图。这为我提供了每页6个绘图: marrangeGrob(plots, nrow=3, ncol=2, top=NULL) 但我需要的是每页5个绘图(即右下绘图区留空) 以下是一个基于我的数据子集的可复制示例: > CohData Name ScenID ScenName Year VarName Units value 1 Site01 0 Hind 2000 ANC ueq/L 28

我有一个绘图列表,正在使用
marrangeGrob
每页编写多个绘图。这为我提供了每页6个绘图:

marrangeGrob(plots, nrow=3, ncol=2, top=NULL)
但我需要的是每页5个绘图(即右下绘图区留空)

以下是一个基于我的数据子集的可复制示例:

> CohData
     Name ScenID ScenName Year VarName Units value
1  Site01      0     Hind 2000     ANC ueq/L 28.23
2  Site02      0     Hind 2000     ANC ueq/L 35.34
3  Site03      0     Hind 2000     ANC ueq/L 31.73
4  Site04      0     Hind 2000     ANC ueq/L 54.21
5  Site05      0     Hind 2000     ANC ueq/L 28.23
6  Site01      1       BC 2020     ANC ueq/L 45.01
7  Site02      1       BC 2020     ANC ueq/L 32.86
8  Site03      1       BC 2020     ANC ueq/L 30.38
9  Site04      1       BC 2020     ANC ueq/L 53.01
10 Site05      1       BC 2020     ANC ueq/L 31.11
11 Site01      0     Hind 2000      pH        6.40
12 Site02      0     Hind 2000      pH        5.93
13 Site03      0     Hind 2000      pH        6.36
14 Site04      0     Hind 2000      pH        5.75
15 Site05      0     Hind 2000      pH        5.16
16 Site01      1       BC 2020      pH        6.63
17 Site02      1       BC 2020      pH        5.86
18 Site03      1       BC 2020      pH        6.33
19 Site04      1       BC 2020      pH        5.73
20 Site05      1       BC 2020      pH        5.23

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

## Iterate plots and write to PDF
pdf("plots.pdf")
plots <- list()
CohData_nohind <- subset(CohData, ScenID > 0)
stream_vars <- list("ANC", "pH")
for (i in unique(CohData_nohind$ScenID)){
  subdata1 <- subset(CohData_nohind, ScenID == i)
  ScenName <- unique(subdata1$ScenName)
  subdata1 <- subset(CohData, ScenID == i | ScenID == 0)
  for (j in stream_vars){
    subdata2 <- subset(subdata1, VarName == j)
    units <- unique(subdata2$Units)
    for (k in unique(subdata2$Name)){
      subdata3 <- subset(subdata2, Name == k)

      if (j=='ANC'){
        p <- ggplot(subdata3, aes(x = Year, y = value)) + geom_line() + expand_limits(y=c(0,100)) + 
          ggtitle(paste0(as.character(ScenName),":\n", as.character(k))) + ylab(paste0(j, " (", units, ")"))
        plots[[paste(i,j,k,sep="_")]] = p

      } else if (j=='pH'){
        p <- ggplot(subdata3, aes(x = Year, y = value)) + geom_line() + expand_limits(y=c(3,7)) +
          ggtitle(paste0(as.character(ScenName),":\n", as.character(k))) + ylab(paste0(j, " (", units, ")"))
        plots[[paste(i,j,k,sep="_")]] = p
      }
    }
  }
}
interleave <- function(x, y, after = 1){

  nx <- length(x)
  ny <- length(y)

  if((nx %% after) > 0) x <- rep(x, length.out=after * ceiling(nx / after))
  mx <- matrix(x, ncol = after, byrow=TRUE)
  my <- rep(y, length.out = nrow(mx))

  c(t(cbind(mx, my)))
}

x <- replicate(7, ggplot(), simplify=FALSE)
y <- replicate(3, nullGrob(), simplify=FALSE)

marrangeGrob(interleave(x,y,3), ncol=2, nrow=2)
dev.off()
>数据
名称ScenID ScenName年份变量名称单位值
1 Site01 0 Hind 2000 ANC ueq/L 28.23
2 Site02 0 Hind 2000 ANC ueq/L 35.34
3 Site03 0 Hind 2000 ANC ueq/L 31.73
4 Site04 0 Hind 2000 ANC ueq/L 54.21
5 Site05 0 Hind 2000 ANC ueq/L 28.23
6 Site01 1 BC 2020 ANC ueq/L 45.01
7 Site02 1 BC 2020 ANC ueq/L 32.86
8地点03 1 BC 2020 ANC ueq/L 30.38
9地点04 1 BC 2020 ANC ueq/L 53.01
10地点05 1 BC 2020 ANC ueq/L 31.11
11 Site01 0 Hind 2000 pH值6.40
12 Site02 0 Hind 2000 pH值5.93
13 Site03 0 Hind 2000 pH值6.36
14 Site04 0 Hind 2000 pH值5.75
15 Site05 0 Hind 2000 pH值5.16
16 Site01 1 BC 2020 pH值6.63
17 Site02 1 BC 2020 pH值5.86
18地点03 1 BC 2020 pH值6.33
19 Site04 1 BC 2020 pH值5.73
20 Site05 1 BC 2020 pH值5.23
图书馆(GG2)
图书馆(网格)
图书馆(gridExtra)
##迭代绘图并写入PDF
pdf(“plots.pdf”)

绘图在第6位和第12位插入空白grob:

plots[7:11] <- plots[6:10]
plots[[6]] <- textGrob("")
plots[[12]] <- textGrob("")

 pdf("plots.pdf")
 marrangeGrob(plots, nrow=3, ncol=2, top=NULL)
 dev.off()
绘图[7:11]我必须通过一个布局,如果它坏了,请告诉我

# devtools::install_github("baptiste/gridextra")
library(gridExtra)
library(grid)

gl <- lapply(seq_len(7), function(ii) grobTree(rectGrob(gp=gpar(fill=ii)), 
                                               textGrob(ii)))
marrangeGrob(gl, layout_matrix=matrix(c(1,2,3,NA), 2))
#devtools::安装_github(“baptiste/gridextra”)
图书馆(gridExtra)
图书馆(网格)

gl这个版本稍微通用一些

interleave <- function(x, y, after = 1){

  nx <- length(x)
  ny <- length(y)

  if((nx %% after) > 0) x <- rep(x, length.out=after * ceiling(nx / after))
  mx <- matrix(x, ncol = after, byrow=TRUE)
  my <- rep(y, length.out = nrow(mx))

  c(t(cbind(mx, my)))
}

library(ggplot2)
library(grid)
library(gridExtra)
x <- replicate(7, ggplot(), simplify=FALSE)
y <- replicate(3, nullGrob(), simplify=FALSE)

marrangeGrob(interleave(x,y,3), ncol=2, nrow=2)

interleave
nullGrob()
可能是比
textGrob(“”)更好的选择。我向GrobMaster鞠躬。谢谢。虽然它适用于测试数据集,但我的完整数据集包含210个绘图列表,并且当我为同一组
名称绘制不同的
VarNames集时,这个数字将发生变化。我应该注意,我已经有效地使用了
布局(矩阵(c(1,2,3,4,5,0),3,2,byrow=TRUE))
过去使用标准的
绘图功能。我基本上是在尝试使用
ggplot
复制这一点,因为我过渡到使用
ggplot2
(我昨天刚刚开始使用)我尝试使用'layout.matrix'参数来
arrangeGrob
,但失败了,可能是因为我使用NA而不是0用于空白位置?我在所有的for循环之后都包含了这个函数,并且在GTabLay-AddithGROB中接收了错误<代码>错误。(gt,grobs,t=位置$t,b=位置$b,:并非所有输入都具有长度1或与“grobs”相同的长度
,是否需要修改某些内容以适合我的代码(除了在最后一行中从
gl
更改为
绘图
)?我猜您的绘图列表的长度与每页的布局x页数不兼容(7个GROB打破了上述示例)。我需要重新思考一下策略,同时,德温的想法是一个很好的解决办法。我没有从德温那里看到任何东西。下面42的建议-适用于这个例子,但不适用于完整列表中的200多个绘图。对于
VarName
s的其他列表,我将有几百个绘图。谢谢重新思考。@viridius:baptiste有很好的记忆力。我曾经使用过SO名字DWin。我在for循环之后包含了这个函数(如编辑的原始帖子所示),但是,这并没有产生预期的结果。这个函数应该放在其他地方还是进行其他编辑?