R巧妙地决定函数中的par mfrow

R巧妙地决定函数中的par mfrow,r,par,R,Par,我想根据数据帧中具有10个以上唯一值的变量数量打印输出。这可以是任意数量的变量。我正在寻找一种方法来实现这一点,将绘图窗口设置为适合变量数量的完美窗口 应该是这样的: 2个变量->1乘2 3个变量->1乘3 4个变量->2乘2 5个变量->2乘3 6个变量->2乘3 16个变量->4乘4 16+变量->4乘4 这是否有一个逻辑公式 如何使其成为成功的par(mfrow=(c(x,y)) 此外,如何确保在达到Par限制时,对于单击< /代码>下一个窗口,当超过16时,我不能单击,而是只覆盖

我想根据数据帧中具有10个以上唯一值的变量数量打印输出。这可以是任意数量的变量。我正在寻找一种方法来实现这一点,将绘图窗口设置为适合变量数量的完美窗口

应该是这样的:

  • 2个变量->1乘2
  • 3个变量->1乘3
  • 4个变量->2乘2
  • 5个变量->2乘3
  • 6个变量->2乘3
  • 16个变量->4乘4
  • 16+变量->4乘4
这是否有一个逻辑公式

如何使其成为成功的
par(mfrow=(c(x,y))

此外,如何确保在达到Par限制时,对于<代码>单击< /代码>下一个窗口,当超过16时,我不能单击,而是只覆盖以前的图。< /P>获取设备的行数和列数。

n2mfrow()
就是为了这个目的而设计的,尽管它的行变化速度往往快于列,因此与您想要的相反。例如:

> n2mfrow(2)
[1] 2 1
np <- 18 ## number of plots
rc <- ifelse(np > 16, 16, np)
op <- par(mfrow = rev(n2mfrow(rc)))
for(i in seq_len(np)) {
  if(i == 2) {
    devAskNewPage(ask = TRUE)
  }
  plot(1:10)
}
par(op)
devAskNewPage(ask = FALSE)
指示2行乘1列。当然,
rev()

> rev(n2mfrow(3))
[1] 1 3
以下是
n2mfrow()
的输出,共有2到16个绘图,其中列变化更快:

t(sapply(2:16, function(x) rev(n2mfrow(x))))

> t(sapply(2:16, function(x) rev(n2mfrow(x))))
      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    2    2
 [4,]    2    3
 [5,]    2    3
 [6,]    3    3
 [7,]    3    3
 [8,]    3    3
 [9,]    3    4
[10,]    3    4
[11,]    3    4
[12,]    4    4
[13,]    4    4
[14,]    4    4
[15,]    4    4
让这个互动 对于“16后单击”位。如果在
for(i in numlots)
循环中进行绘图,当
i
>16调用
devasknowpage(ask=TRUE)
时,将提示用户激活下一个绘图

例如:

> n2mfrow(2)
[1] 2 1
np <- 18 ## number of plots
rc <- ifelse(np > 16, 16, np)
op <- par(mfrow = rev(n2mfrow(rc)))
for(i in seq_len(np)) {
  if(i == 2) {
    devAskNewPage(ask = TRUE)
  }
  plot(1:10)
}
par(op)
devAskNewPage(ask = FALSE)

我真的不明白你想要实现什么。听起来你想把情节分成两部分?如果是,,您可以。@Roland并非所有函数/软件包都使用ggplot2进行打印,并且镶嵌面与
mfrow
对打印设备所做的不一样。下面的答案似乎都没有解决在打印编号>16时使用单击继续下一个打印的问题。@GavinSimpson我很清楚这一点,并且经常使用base我自己。但正如我所说,我甚至不理解这个问题。第一句话可能意味着很多事情。@marcinebox你不容易做到这一点<代码>定位器(1)
在一个名为if loop index>16、32等的循环中,将强制用户单击绘图
devasknowpage()
可用于控制台中的提示。甚至可能不使用
rev()
更可取。我必须考虑一下。如果你想要大小不等的区域
layout()
函数提供了一个替代方法..我让devAskNewPage工作了。在我的例子中,我必须减去for循环整数
I的大小写-顺序变量%%16==0
@duality with
devasknowpage()
您只需调用它一次,因为它只影响设备的新页面,而不是打印窗口。查看我的更新答案-您只需在绘图1完成后打开它。如果在循环之前设置它,那么在绘制第一个图之前会被询问,这不是我们想要的。@GavinSimpson明白了。更改为:
if((i-ord)==16){devasknowpage(ask=TRUE)}
(在循环内)